Ansible 批量下载 免密
时间: 2025-01-07 22:07:00 浏览: 8
### 使用 Ansible 批量下载文件并配置免密登录
#### 安装 Ansible 和准备环境
为了实现批量操作,首先需要确保目标机器上已经安装了 Ansible。可以通过包管理器来完成这一工作:
```bash
sudo apt-get update && sudo apt-get install -y ansible
```
对于 RedHat/CentOS 类系统,则应使用 `yum`:
```bash
sudo yum install epel-release
sudo yum install ansible
```
#### 编写 Playbook 进行批量下载文件
Ansible 的强大之处在于其 playbook 文件,这些 YAML 格式的剧本定义了一系列的任务去执行特定的操作。
创建一个新的 playbook 来描述要执行的动作,比如名为 `batch_download.yml` :
```yaml
---
- hosts: all
become: yes
tasks:
- name: Download file from URL
get_url:
url: http://example.com/path/to/file.zip
dest: /tmp/file.zip
mode: '0755'
```
上述脚本会指示每台主机从指定URL地址下载压缩包到临时目录下,并设置权限为可读可执行[^1]。
#### 设置 SSH 密钥认证以支持无密码登录
为了让后续任务能够顺利运行而不需要人工干预输入密码,在此之前还需要先建立SSH公私钥对以及分发给各节点。
编写另一个playbook用于生成密钥对并将公钥复制至远程服务器,命名为 `setup_ssh_key.yml` :
```yaml
---
- hosts: localhost
gather_facts: no
tasks:
- name: Generate ssh key pair on local machine if not exist
user:
name: "{{ansible_user}}"
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: ~/.ssh/id_rsa
when: lookup('file', '~/.ssh/id_rsa.pub') is failed
- hosts: all
become: true
tasks:
- name: Ensure .ssh directory exists with proper permissions
file:
path: /root/.ssh
state: directory
owner: root
group: root
mode: '0700'
- name: Copy public key to remote host's authorized_keys
authorized_key:
user: root
state: present
key: "{{lookup('file', '/home/{{ansible_user}}/.ssh/id_rsa.pub')}}"
```
这段代码首先会在本地计算机检查是否存在SSH密钥对,如果不存在则自动生成一对新的RSA密钥;接着向所有被管设备推送当前用户的公钥,使得之后可以无需密码验证即可通过SSH连接它们[^2]。
#### 合并两个Playbooks简化流程
考虑到实际应用场景可能更倾向于一次性完成全部准备工作,因此可以把上面提到的功能整合成单一的playbook以便于管理和调用。
以下是综合版本的 `prepare_environment.yml` :
```yaml
---
- hosts: localhost
connection: local
gather_facts: false
vars_prompt:
- name: target_hosts
prompt: Please enter the IP addresses or hostname of targets separated by commas.
private: no
tasks:
- name: Install required packages locally
package:
name: python3-pip,git
state: latest
- block:
- include_tasks: setup_ssh_key.yml
- add_host:
name: "{{ item }}"
loop: "{{target_hosts.split(',')}}"
- meta: flush_handlers
delegate_to: localhost
- hosts: all
any_errors_fatal: true
roles:
- role: common_role # 假设有一个通用的角色负责处理一些基础性的事务
post_tasks:
- import_playbook: batch_download.yml
```
这个完整的 playbooks 不仅实现了前面介绍过的功能,还加入了动态添加新主机的能力,允许用户交互式地提供待部署的目标列表。此外,它也引入了一个假设存在的角色 (`common_role`) ,这通常用来封装那些几乎每次都会涉及到的基础设定项,如更新软件源、关闭防火墙等[^3]。
阅读全文