我使用Ansible将目录(900个文件,136 136MBytes)从一个主机复制到另一个主机:
---
- name: copy a directory
copy: src={{some_directory}} dest={{remote_directory}}这个操作花费了惊人的17分钟,而一个简单的scp -r <src> <dest>只需要7秒。
我尝试了加速模式,根据非标文档的说法,但没有结果。
可以比启用ControlPersist的SSH快2-6倍,比paramiko快10倍。
发布于 2015-01-17 01:52:43
使用synchronize而不是copy。
下面是我使用的copy命令:
- copy: src=testdata dest=/tmp/testdata/我猜想,同步操作是缓慢的。文件模块文档也暗示了这一点:
“复制”模块递归复制功能不会扩展到大量(>数百)文件。有关其他选项,请参见同步模块,它是rsync的包装器。
深入了解源代码显示的是每个文件都用SHA1处理。。那是使用hashlib.sha1实现。本地测试意味着900个文件只需10秒(刚好占用400 of的空间)。
所以下一条路。该副本由移动法处理。我不确定加速模式是否有帮助(这是一个主要是不推荐的特性),但我尝试了流水线,将它放在本地ansible.cfg中
[ssh_connection]
pipelining=True这似乎没什么用,我的样本花了24分钟才运行。显然有一个循环来检查一个文件,上传它,修复权限,然后开始下一个文件。这是很多命令,即使ssh连接仍然处于打开状态。读行之间有一点意义--我认为“文件传输”不能用流水线来完成。
因此,按照使用synchronize命令的提示:
- synchronize: src=testdata dest=/tmp/testdata/这花了18秒,即使是pipeline=False也是如此。显然,在这种情况下,使用synchronize命令是可行的。
请记住,synchronize使用rsync,它默认为mod时间和文件大小。如果您需要或需要校验和,请将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": []}发布于 2017-06-19 15:36:09
发布于 2018-04-24 13:00:48
我找到的最佳解决方案是直接压缩文件夹并使用unarchive模块。
450 MB文件夹在1分钟内完成。
unarchive:
src: /home/user/folder1.tar.gz
dest: /opthttps://stackoverflow.com/questions/27985334
复制相似问题