Ansible fetch模块拉取远程大文件耗时过长,求原因及替代方案
Ansible Fetch模块拉取大文件失败问题排查与替代方案
问题原因分析
针对你用Fetch模块拉取500MB的volumes.zip始终无法完成的情况,核心原因集中在大文件传输的特性限制上:
- SSH连接超时:默认SSH会话的超时阈值较短,大文件传输耗时超出限制后会导致连接中断,任务失败。
- Fetch模块自身局限:Fetch模块底层依赖SFTP/SCP传输,没有断点续传机制,一旦传输中断需重新开始;同时它的传输效率远低于原生的rsync或直接scp命令。
- Ansible参数限制:默认的
ansible_ssh_timeout(通常为10秒)、传输缓冲区大小等参数不足以支撑大文件的长时间传输。
替代方案
1. 直接调用scp命令
利用原生scp的传输性能,通过delegate_to将任务切换到本地执行:
- name: Copy volumes.zip to local via scp delegate_to: localhost command: scp {{ ansible_user }}@{{ inventory_hostname }}:/tmp/volumes.zip /home/user/volumes/
注意:需确保本地主机已配置与目标主机的免密SSH登录,避免手动输入密码。
2. 使用rsync(推荐)
rsync支持增量传输和断点续传,是大文件传输的最优选择,可直接用命令或Ansible的rsync模块:
方式一:调用rsync命令
- name: Sync volumes.zip to local via rsync delegate_to: localhost command: rsync -avz --partial {{ ansible_user }}@{{ inventory_hostname }}:/tmp/volumes.zip /home/user/volumes/
--partial参数确保传输中断后下次可续传,无需重新开始。
方式二:Ansible rsync模块
- name: Sync volumes.zip using rsync module rsync: src: "{{ ansible_user }}@{{ inventory_hostname }}:/tmp/volumes.zip" dest: "/home/user/volumes/" mode: pull rsync_opts: - "--compress" - "--partial"
需确保本地和目标主机都安装了rsync工具。
3. 优化参数继续使用Fetch模块
如果坚持使用Fetch模块,可通过调整参数解决超时问题:
- 在inventory文件或剧本中添加SSH超时配置:
vars: ansible_ssh_timeout: 300 # 延长超时到5分钟 ansible_pipelining: true # 提升传输效率 - 在本地
~/.ssh/config中添加SSH保活配置:
避免SSH会话因长时间无交互被断开。Host * ServerAliveInterval 60 ServerAliveCountMax 10
内容的提问来源于stack exchange,提问作者Héctor Valls
相关产品推荐
相关产品推荐

