【发布时间】:2016-10-07 20:17:15
【问题描述】:
我正在尝试使用 Ansible-synchronize 将一堆文件同时部署到多组服务器。现在我们有一个手工制作的顺序解决方案,它可以处理 SCP,但显然不能很好地扩展。由于 Ansible 使用 SSH 多路复用,我认为这可以满足我的目的。这是我的设置的代表性描述:
远程文件服务器.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,...}
...
远程目标服务器:
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 错误: clientserver.c(124) 处的套接字 IO(代码 10)中的错误 [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", "rc ": 23
这是我的问题:
- Ansible 是否适合我的目的?
- 我对 Ansible 的期望不正确吗?
- 我对“同步”的假设不正确吗?
- 我可以在我的剧本中进行哪些更改以使推送模式更快(forks = 20)或修复我的拉模式设置?
- 是否有正确的方法让 Ansible 使用 rsync over ssh 拉取文件?
- 除了手工制作我自己的基于 Python 的自定义并行文件拉取解决方案之外,我还能做些什么吗?
(不,Chef/Puppet/Salt 不是选项,因为我们不想在目标框上运行类似代理的东西)
谢谢!
【问题讨论】:
-
您是否清楚,如果您有 20 个客户端尝试从同一台服务器同步,每个客户端将获得 1/20 的服务器带宽?无论如何,什么是 {{ src_path }}?
-
@GUIDO {{ src_path }} 是文章开头提到的 remotefileserver.x 上的路径。它是 remotefileserver.x 上的一个文件,我想 rsync/复制到所有目标服务器。例如,在 remotefileserver.x 上,它的路径可能是:
/storage/path/to/versions/component1/versionid-1/file1。感谢您对此进行调查!
标签: deployment parallel-processing ansible rsync devops