2016-10-07 69 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 }}"