Ansible同步远程并行远程

时间:2016-10-07 20:17:16

标签: deployment parallel-processing ansible rsync devops

我正在尝试使用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

以下是我的问题:

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

(不,Chef / Puppet / Salt不是选项,因为我们不想在目标框上运行类似代理的东西)

谢谢!

2 个答案:

答案 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播放也会卡住。