Ansible 2.4环境下从受控节点获取大文件的合规方案咨询
Ansible 2.4 大文件拉取的可行方案
方案一:给你的scp临时方案补全错误处理
原来的shell模块执行scp没有错误处理,改成下面这样,能避免无效执行、明确失败场景:
- name: 先检查远程文件是否存在 stat: path: /tmp/file_generated_previous_step.tar.gz register: remote_file - name: 拉取大文件到控制节点 command: scp {{ inventory_hostname }}:/tmp/file_generated_previous_step.tar.gz file_generated_{{ inventory_hostname }}.tar.gz delegate_to: localhost # 只在文件存在时执行 when: remote_file.stat.exists # 明确哪些情况算任务失败 failed_when: "'No such file' in stdout or 'Permission denied' in stdout or rc != 0" changed_when: true
这里用stat先确认文件存在,用command替代shell减少安全风险,还通过failed_when精准判断失败场景,不会因为无关输出误判。
方案二:用synchronize模块(更适合大文件)
Ansible 2.4里的synchronize是rsync的封装,天生适合大文件传输,支持断点续传,效率比scp高,还自带错误处理:
- name: 用rsync拉取大文件 synchronize: src: /tmp/file_generated_previous_step.tar.gz dest: ./file_generated_{{ inventory_hostname }}.tar.gz mode: pull delegate_to: "{{ inventory_hostname }}"
注意:需要控制节点和目标机器都装rsync(大部分Linux系统默认自带),mode: pull表示从远端拉到本地,传输失败会直接返回失败状态,不用额外写判断。
方案三:修复原fetch模块的问题
fetch模块处理大文件失败,大概率是超时或者传输方式的问题,试试修改ansible.cfg的全局配置:
[defaults] timeout = 300 # 把超时从默认10秒改成5分钟,给大文件足够传输时间 transfer_timeout = 300 [ssh_connection] scp_if_ssh = True # 强制用scp传输,部分场景下能解决大文件的传输限制
改完配置后再跑原来的fetch Playbook,可能就能正常工作了。
内容的提问来源于stack exchange,提问作者Trifo
相关产品推荐
相关产品推荐

