web-dev-qa-db-ja.com

Ansibleでディレクトリをコピーするのに時間がかかるのはなぜですか?

Ansibleを使用して、あるホストから別のホストにディレクトリ(900ファイル、136Mバイト)をコピーしています:

---
- name: copy a directory
  copy: src={{some_directory}} dest={{remote_directory}}

この操作には17分かかりますが、単純なscp -r <src> <dest>はわずか7秒かかります。

ansible docs 「ControlPersistが有効になっているSSHの2倍から6倍、paramikoの10倍の高速化」に従って加速モードを試しましたが、役に立ちませんでした。

52
dokaspar

TLDR:synchronizeの代わりにcopyを使用します。

私が使用しているcopyコマンドは次のとおりです。

- copy: src=testdata dest=/tmp/testdata/

推測として、私は同期操作が遅いと仮定します。 files module documentation はこれも意味しています:

「コピー」モジュールの再帰的コピー機能は、大量のファイル(数百)に対応していません。別の方法については、rsyncのラッパーである同期モジュールを参照してください。

ソースを掘り下げると 各ファイルはSHA1で処理されます と表示されます。 hashlib.sha1を使用して実装 です。ローカルテストでは、900ファイルに対してたった10秒しかかかりません(たまたま400MBのスペースが必要です)。

それで、次の道。コピーは module_utils/basic.pyのatomic_moveメソッド で処理されます。加速モードが役立つかどうかはわかりませんが( ほとんど廃止予定の機能 )、しかし pipelining を試して、これをローカルansible.cfgに入れました:

[ssh_connection]
pipelining=True

現れなかった;サンプルの実行には24分かかりました。明らかに、ファイルをチェックしてアップロードし、権限を修正してから次のファイルで開始するループがあります。 ssh接続が開いたままの場合でも、これは多くのコマンドです。行間を読むことは少し理にかなっています。「ファイル転送」はパイプラインではできません。

したがって、synchronizeコマンドを使用するためのヒントに従ってください。

- synchronize: src=testdata dest=/tmp/testdata/

pipeline=Falseであっても、18秒かかりました。明らかに、synchronizeコマンドがこの場合の方法です。

synchronizeは、デフォルトでmod-timeとファイルサイズに設定されているrsyncを使用することに注意してください。チェックサムが必要または必要な場合は、checksum=Trueをコマンドに追加します。チェックサムが有効になっていても、時間は実際には変わりませんでしたが、まだ15〜18秒です。 ansible-playbook-vvvvで実行して、チェックサムオプションがオンになっていることを確認しました。

ok: [testhost] => {"changed": false, "cmd": "rsync --delay-updates -FF --compress --checksum --archive --rsh 'ssh  -o StrictHostKeyChecking=no' --out-format='<<CHANGED>>%i %n%L' \"testdata\" \"[email protected]:/tmp/testdata/\"", "msg": "", "rc": 0, "stdout_lines": []}
83
tedder42

synchronize構成は、become_userの環境では difficult になります。 1回限りの展開では、ソースディレクトリをアーカイブし、unarchiveモジュールでコピーできます。

- name: copy a directory
  unarchive:
    src: some_directory.tar.gz
    dest: {{remote_directory}}
    creates: {{remote_directory}}/indicator_file
8
void

私が見つけた最良の解決策は、フォルダーを圧縮してunarchiveモジュールを使用することです。

450 MBフォルダーは1分で終了しました。


unarchive:
   src: /home/user/folder1.tar.gz
   dest: /opt
2
Rinu K V

この場合、synchronizecopyよりも望ましいですが、rsyncによってベイク処理されます。これは、rsync(クライアント/サーバーアーキテクチャ)の欠点も残っていることを意味します。CPUとディスクの境界、大きなファイルのファイル内デルタ計算の速度が遅いなどです。ピアツーピアアーキテクチャに基づくソリューション。多くのマシンに対して高速で簡単にスケーラブルです。 BitTorrentベースのResilio Connectのようなもの。

0
user8369145