【问题标题】:Ansible Synchronize Parallel Remote-To-RemoteAnsible 同步并行远程到远程
【发布时间】: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


【解决方案1】:

通过强制 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 }}"

【讨论】:

    【解决方案2】:

    确保在远程节点之间启用基于 SSH 密钥的身份验证。

    远程节点之间必须启用无密码登录。否则,同步任务会卡住,你的 Ansible 也会卡住。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2012-03-05
      • 2013-03-07
      • 1970-01-01
      • 2011-05-07
      相关资源
      最近更新 更多