如何将文件下载到Ansible Controller而非远程受控节点?
Ansible 跨内外网文件下载传输解决方案
方案1:委派下载任务到控制端+文件同步(通用场景首选)
核心逻辑是通过delegate_to参数将下载任务切换到有内网访问权限的Ansible控制端执行,下载完成后再通过SSH同步到外网目标节点,支持所有大小的文件,可自定义缓存逻辑。
示例Playbook如下:
--- - name: 内网资源下载并同步到外网节点 hosts: target gather_facts: false vars: # 替换为实际内网资源地址 internal_file_url: "http://internal-repo.com/softwares/v2.3.0.tar.gz" # 控制端临时缓存路径 local_cache_path: "/tmp/ansible_cache/v2.3.0.tar.gz" # 目标节点存放路径 remote_dest_path: "/usr/local/src/v2.3.0.tar.gz" tasks: - name: 控制端下载内网资源 ansible.builtin.get_url: url: "{{ internal_file_url }}" dest: "{{ local_cache_path }}" mode: "0644" validate_certs: false # 如果内网是自签证书可开启该参数 delegate_to: localhost run_once: true # 多目标节点场景下仅下载一次 become: false # 根据控制端权限调整 - name: 同步文件到目标节点 ansible.builtin.copy: src: "{{ local_cache_path }}" dest: "{{ remote_dest_path }}" mode: "0644" # 可选:清理控制端临时缓存,需要复用缓存可删除该任务 - name: 清理控制端临时缓存文件 ansible.builtin.file: path: "{{ local_cache_path }}" state: absent delegate_to: localhost run_once: true
方案2:小文件免缓存直接写入
针对体积小于10M的配置文件、脚本等小资源,可利用Ansible lookup插件默认在控制端执行的特性,无需生成本地临时文件,直接拉取内容写入目标节点:
- name: 拉取内网小文件内容写入目标节点 ansible.builtin.copy: content: "{{ lookup('url', 'http://internal-repo.com/configs/prod.yml', validate_certs=False) }}" dest: "/etc/app/prod.yml" mode: "0644"
方案3:大文件传输优化
如果资源体积超过100M,建议用ansible.posix.synchronize模块替代copy模块,基于rsync协议实现差量传输,速度更快且支持断点续传:
- name: 大文件rsync同步到目标节点 ansible.posix.synchronize: src: "{{ local_cache_path }}" dest: "{{ remote_dest_path }}" checksum: yes # 开启校验保证文件一致性
以上所有方案均兼容Ansible core 2.11.6版本,无需额外安装第三方依赖。
内容的提问来源于stack exchange,提问作者khmarbaise
相关产品推荐
相关产品推荐

