如何用Ansible从非清单主机向清单主机拉取文件?
解决方案:从第三方主机拉取文件到清单内主机的幂等实现
首先明确:Ansible的fetch模块仅支持从清单内的受控主机拉取文件到控制节点(10.3.3.10),无法直接从不在清单的第三方主机(10.10.10.100)拉取到目标主机。不过可以通过以下几种原生/幂等方法替代shell模块的scp命令:
方法一:使用get_url模块直接拉取(推荐,原生幂等)
get_url模块支持通过SSH协议拉取文件,会自动校验文件的哈希值或修改时间,仅当源文件更新时才会重新拉取,天然具备幂等性。需要确保清单内的linux组主机能直接访问10.10.10.100的SSH服务。
示例Playbook:
- name: 从第三方主机拉取文件到linux组主机 hosts: linux tasks: - name: 拉取special_script到/root目录 ansible.builtin.get_url: url: 'sftp://admin@10.10.10.100/backup/scripts/special_script' dest: /root/special_script mode: '0755' # 可选:添加校验和确保文件完整性,替换为实际MD5值 checksum: 'md5:abc123def456' vars: # 提前在linux组主机配置对10.10.10.100的SSH密钥信任,避免密码交互 ansible_ssh_private_key_file: /root/.ssh/id_rsa
如果需要密码认证,可添加url_username和url_password参数,但优先推荐SSH密钥方式避免明文密码风险。
方法二:通过控制节点中转(适合目标主机无法直连第三方主机的场景)
先将第三方主机的文件拉取到控制节点,再推送到linux组主机,全程使用Ansible原生模块保证幂等性:
示例Playbook:
- name: 从第三方主机拉取文件到控制节点中转 hosts: localhost gather_facts: no tasks: - name: 拉取special_script到控制节点临时目录 ansible.builtin.fetch: src: /backup/scripts/special_script dest: /tmp/third_party_files/ flat: yes delegate_to: 10.10.10.100 vars: ansible_host: 10.10.10.100 ansible_user: admin ansible_ssh_private_key_file: /root/.ssh/id_rsa - name: 将中转文件推送到linux组主机 hosts: linux tasks: - name: 复制文件到/root目录 ansible.builtin.copy: src: /tmp/third_party_files/special_script dest: /root/special_script mode: '0755'
注意:需提前让控制节点(10.3.3.10)能通过SSH访问10.10.10.100,delegate_to临时将任务指向第三方主机,配合临时变量完成连接。
方法三:对shell模块的scp命令做幂等优化
如果必须依赖scp命令,可以通过校验文件一致性实现幂等,避免重复执行:
- name: 幂等执行scp拉取 hosts: linux tasks: - name: 获取第三方文件的MD5值 ansible.builtin.shell: ssh admin@10.10.10.100 "md5sum /backup/scripts/special_script | awk '{print $1}'" register: src_md5 changed_when: false - name: 获取本地文件的MD5值(若存在) ansible.builtin.stat: path: /root/special_script get_checksum: yes register: dest_stat - name: 仅当文件不存在或校验和不一致时拉取 ansible.builtin.shell: scp admin@10.10.10.100:/backup/scripts/special_script /root/ when: > dest_stat.stat.exists == false or dest_stat.stat.checksum != src_md5.stdout
这种方法依赖目标主机与第三方主机的SSH连通性,以及md5sum命令的可用性,可靠性略低于前两种原生模块方案。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

