我正在尝试使用Ansible-synchronize同时将一堆文件部署到多组服务器。现在我们有一个手工制作的顺序解决方案,可以做SCP并且显然不能很好地扩展。由于Ansible使用SSH多路复用,我认为这将符合我的目的。以下是我的设置的代表性描述:
remotefileserver.x:
/storage/path/to/versions/component1/versionid-1/{file1,file2,file3,dir1/file1,dir2/file1,...}
/storage/path/to/versions/component1/versionid-2/{file1,file2,file3,dir1/file1,dir2/file1,...}
/storage/path/to/versions/component2/versionid-1/{file1,file2,file3,dir1/file1,...}
/storage/path/to/versions/component3/versionid-1/{file1,file2,file3,dir1/file1,...}
...
remotetargetservers:
target1.x
target2.x
...
target10.x
ansible.cfg:
pipelining = True
forks = 20
我最初有以下剧本设置:
hosts: {{ remotetargetservers }}
tasks:
- name: deploying site-specific files
synchronize:
src: "{{ src_path }}"
dest: "{{ dest_dir }}/{{ item }}"
checksum: yes
delegate_to: remotefileserver.x
with_items: "{{ files_list }}"

这在技术上有效,但我的加速只有1.25倍(不是很大的改进),因为我希望靠近' n'或至少超过' n / 2'加速。我读到某个地方,在拉模式下同步应该更好,我假设这样,因为(至少理论上)在拉模式下我们会将复制的责任委托给各个目标主机=>靠近' n'加速。
所以我把我的剧本改为:
hosts: {{ remotetargetservers }}
tasks:
- name: deploying site-specific files
synchronize:
mode: pull
src: "rsync://remotefileserver.x/{{ src_path }}"
dest: "{{ dest_dir }}/{{ item }}"
checksum: yes
delegate_to: "{{ inventory_hostname }}"
with_items: "{{ files_list }}"

当我运行它时,我收到以下错误:
" ...,msg":" rsync:无法连接到remotefileserver.x:连接被拒绝(111)\ nrsync错误:客户端服务器上的套接字IO(代码10)中出错。 c(124)[receiver = 3.0.6] \ n"," rc":10}
在互联网的其他地方,有人建议我确保rsync守护程序在两台主机上都运行。我的系统管理员不会运行rsync守护进程,并建议我使用rsync的rsync-over-ssh功能。我已经验证了这个命令:
rsync -av remotefileserver.x:/path/to/files /my/destination
从其中一个目标服务器成功运行。
所以我试过了:
src: "remotefileserver.x/{{ path }}"
并得到了一大堆其他安全错误
"可能的突破尝试! 失败:没有这样的文件或目录(2)\ nrsync错误:在main.c(1505)[receiver = 3.0.6] \ n"中没有传输某些文件/ attrs(参见先前的错误)(代码23), " rc":23
以下是我的问题:
(不,Chef / Puppet / Salt不是选项,因为我们不想在目标框上运行类似代理的东西)
谢谢!
答案 0 :(得分:0)
通过强制rsync使用ssh,您应该能够克服这个问题。 rsync_opts:" -e ssh -p 22"
hosts: {{ remotetargetservers }}
tasks:
- name: deploying site-specific files
synchronize:
mode: pull
src: "rsync://remotefileserver.x/{{ src_path }}"
dest: "{{ dest_dir }}/{{ item }}"
checksum: yes
rsync_opts: "-e ssh -p 22"
delegate_to: "{{ inventory_hostname }}"
with_items: "{{ files_list }}"

答案 1 :(得分:0)
确保在远程节点之间启用了基于SSH密钥的身份验证。
必须在远程节点之间启用无密码登录。否则,同步任务会卡住,您的Ansible播放也会卡住。