Ansible技术问题:如何提升win_copy模块的文件传输速度?
提升Ansible win_copy速度及替代方案
优化win_copy传输速度的方法
- 调整WinRM服务配置:win_copy依赖WinRM通道传输,默认参数限制了传输效率,在Windows目标节点执行以下命令调大相关参数:
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="1024"}' winrm set winrm/config/service '@{MaxConcurrentOperationsPerUser="100"}' winrm set winrm/config '@{MaxEnvelopeSizekb="8192"}' - 启用Ansible WinRM管道化:在
ansible.cfg中添加或修改配置,减少WinRM交互次数:
同时调整WinRM超时参数:[defaults] pipelining=True[winrm] winrm_read_timeout_sec=60 winrm_operation_timeout_sec=30 - 压缩后传输再解压:针对多文件或大文件场景,先在Linux控制节点打包压缩,传输后在Windows端解压:
- Linux端打包:
tar zcf target_files.tar.gz /path/to/source/files - 用win_copy传输压缩包到Windows
- 用
win_unzip模块解压到目标路径
- Linux端打包:
- 异步执行批量任务:如果是批量复制文件,启用异步模式减少等待开销:
- name: 异步复制文件 win_copy: src: "{{ item }}" dest: C:\target\ loop: "{{ file_list }}" async: 300 poll: 0 register: copy_jobs - name: 等待复制任务完成 async_status: jid: "{{ item.ansible_job_id }}" loop: "{{ copy_jobs.results }}" until: item.finished retries: 10 delay: 5
替代复制方案(绕过WinRM提升速度)
- SMB共享挂载复制:
- 在Windows目标节点创建SMB共享目录,配置权限允许Linux控制节点访问
- 在Linux控制节点挂载共享:
mount -t cifs //WIN_SERVER_IP/share_path /mnt/win_share -o username=WIN_USER,password=WIN_PASS - 用Ansible的
copy模块直接复制到挂载目录,绕过WinRM通道:- name: 复制文件到SMB挂载目录 copy: src: /path/to/local/file dest: /mnt/win_share/target/
- Rsync传输:
- 在Windows目标节点安装Rsync服务(如cwRsync)并配置
- 在Linux控制节点用Ansible调用rsync命令传输:
- name: Rsync文件到Windows command: rsync -avz /path/to/source/files WIN_USER@WIN_SERVER_IP::share_module/target/
- WinSCP命令行传输:
- Linux控制节点安装WinSCP
- 编写WinSCP脚本并通过Ansible调用,实现SCP/SFTP传输:
- name: 用WinSCP传输文件 shell: | winscp.com /command "open sftp://WIN_USER:WIN_PASS@WIN_SERVER_IP/" "put /path/to/local/file C:\target\file" "exit"
内容的提问来源于stack exchange,提问作者Iga21207
相关产品推荐
相关产品推荐

