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倍の高速化」に従って加速モードを試しましたが、役に立ちませんでした。
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\" \"user@testhost:/tmp/testdata/\"", "msg": "", "rc": 0, "stdout_lines": []}
synchronize
構成は、become_user
の環境では difficult になります。 1回限りの展開では、ソースディレクトリをアーカイブし、unarchive
モジュールでコピーできます。
- name: copy a directory
unarchive:
src: some_directory.tar.gz
dest: {{remote_directory}}
creates: {{remote_directory}}/indicator_file
私が見つけた最良の解決策は、フォルダーを圧縮してunarchive
モジュールを使用することです。
450 MBフォルダーは1分で終了しました。
unarchive:
src: /home/user/folder1.tar.gz
dest: /opt
この場合、synchronize
はcopy
よりも望ましいですが、rsyncによってベイク処理されます。これは、rsync(クライアント/サーバーアーキテクチャ)の欠点も残っていることを意味します。CPUとディスクの境界、大きなファイルのファイル内デルタ計算の速度が遅いなどです。ピアツーピアアーキテクチャに基づくソリューション。多くのマシンに対して高速で簡単にスケーラブルです。 BitTorrentベースのResilio Connectのようなもの。