TLDR:使用synchronize 而不是copy。
这是我正在使用的copy 命令:
- copy: src=testdata dest=/tmp/testdata/
作为猜测,我认为同步操作很慢。 files module documentation 也暗示了这一点:
“复制”模块递归复制工具不能扩展到大量(>数百)个文件。对于替代方案,请参阅同步模块,它是 rsync 的包装器。
挖掘源代码显示each file is processed with SHA1。那是implemented using hashlib.sha1。本地测试意味着 900 个文件只需要 10 秒(恰好占用 400mb 空间)。
所以,下一条途径。副本由module_utils/basic.py's atomic_move method 处理。我不确定加速模式是否有帮助(它是mostly-deprecated feature),但我尝试了pipelining,将其放入本地ansible.cfg:
[ssh_connection]
pipelining=True
它似乎没有提供帮助;我的样本运行了 24 分钟。显然有一个循环检查文件,上传文件,修复权限,然后开始下一个文件。这是很多命令,即使 ssh 连接保持打开状态。在字里行间阅读它有点意义——我认为“文件传输”不能在流水线中完成。
所以,按照提示使用synchronize 命令:
- synchronize: src=testdata dest=/tmp/testdata/
即使使用pipeline=False,也需要 18 秒。显然,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": []}