2016-10-07 68 views
0

我正在尝试使用Ansible-synchronize将一堆文件同时部署到多组服务器。现在我们有一个手工制作的顺序解决方案,可以做SCP,但显然不能很好地伸缩。由于Ansible使用SSH多路复用,我认为这将符合我的目的。这是我设置的代表介绍:Ansible同步并行远程到远程

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/2”加速获得附近“n”或至少东西。我在pull模式下阅读的某处应该更好地工作,因为我们假设在拉模式下(至少在理论上),我们会将复制的责任委托给单个目标主机=>接近'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: failed to connect to remotefileserver.x: Connection refused (111)\nrsync error: error in socket IO (code 10) at clientserver.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 }}" 

,并得到了一大堆其他安全错误

"POSSIBLE BREAK-IN ATTEMPT! failed: No such file or directory (2)\nrsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1505) [receiver=3.0.6]\n", "rc": 23

这里是我的问题:

  • 是Ansible甚至适合我的目的?
  • 我对Ansible的期望是否不正确?
  • 我对'同步'的假设是不正确的吗?
  • 有什么我可以改变我的剧本,使推模式更快(forks = 20)或修复我的拉模式设置?
  • 有没有一种正确的方法可以让Ansible通过ssh使用rsync来提取文件?
  • 还有什么我可以做的手工制作我自己的基于自定义Python的并行文件拉解决方案吗?

(不,厨师/木偶/盐没有选择,因为我们不希望在其上运行的目标箱子剂样东西)

谢谢!

+0

你已经明确表示,如果有20个客户试图从同一服务器同步,每一个获取服务器带宽的1/20 ?无论如何,什么是{{src_path}}? –

+0

@GUIDO ** {{src_path}} **是本文开头提到的_remotefileserver.x_上的路径。它是_remotefileserver.x_上的一个文件,我想将rsync/copy复制到所有的目标服务器。例如,在_remotefileserver.x_上,它的路径可以是:'/ storage/path/to/versions/component1/versionid-1/file1'。感谢您查看这个! –

回答

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 }}"