我正在使用Ansible将目录(900个文件,136MBytes)从一个主机复制到另一个主机:
---
- name: copy a directory
copy: src={{some_directory}} dest={{remote_directory}}
Run Code Online (Sandbox Code Playgroud)
这项操作耗时17分钟,而简单scp -r <src> <dest>只需7秒钟.
我已经尝试了加速模式,根据ansible 文档 "可以比启用ControlPersist的SSH快2-6倍,比paramiko快10倍.",但无济于事.
ted*_*r42 85
TLDR:使用synchronize而不是copy.
这是copy我正在使用的命令:
- copy: src=testdata dest=/tmp/testdata/
Run Code Online (Sandbox Code Playgroud)
作为一种猜测,我认为同步操作很慢.该文件模块文档说明了这点太:
递归复制工具的"复制"模块不能扩展到大量(>数百个)文件.有关替代方法,请参阅synchronize模块,它是rsync的包装器.
深入研究源显示每个文件都使用SHA1进行处理.这是使用hashlib.sha1实现的.本地测试意味着900个文件只需要10秒钟(恰好需要400mb的空间).
所以,下一个途径.该副本使用module_utils/basic.py的atomic_move方法处理.我不确定加速模式是否有帮助(这是一个大多数已被弃用的功能),但我尝试了流水线操作,将其置于本地ansible.cfg:
[ssh_connection]
pipelining=True
Run Code Online (Sandbox Code Playgroud)
它没有出现帮助; 我的样本需要24分钟才能运行.显然有一个循环可以检查文件,上传文件,修复权限,然后在下一个文件上启动.即使ssh连接处于打开状态,这也是很多命令.在线之间阅读它有点意义 - 我认为,"文件传输"无法在流水线中完成.
因此,按照提示使用synchronize命令:
- synchronize: src=testdata dest=/tmp/testdata/
Run Code Online (Sandbox Code Playgroud)
这花了18秒,即使是pipeline=False.显然,synchronize命令是这种情况下的方法.
请记住synchronize使用rsync,默认为mod-time和文件大小.如果您想要或需要校验和,请添加checksum=True到命令中.即使启用了校验和,时间也没有真正改变 - 仍然是15-18秒.我核实校验选项是在运行ansible-playbook与-vvvv,可以在这里看到:
ok: [testhost] => {"changed": false, "cmd": "rsync --delay-updates -FF --compress --checksum --archive --rsh 'ssh -o StrictHostKeyChecking=no' --out-format='<<CHANGED>>%i %n%L' \"testdata\" \"user@testhost:/tmp/testdata/\"", "msg": "", "rc": 0, "stdout_lines": []}
Run Code Online (Sandbox Code Playgroud)
voi*_*oid 10
synchronize在环境中配置可能很困难become_user.对于一次性部署,您可以归档源目录并使用unarchive模块进行复制:
- name: copy a directory
unarchive:
src: some_directory.tar.gz
dest: {{remote_directory}}
creates: {{remote_directory}}/indicator_file
Run Code Online (Sandbox Code Playgroud)