スピードアップAnsible

セクショナルターボチャージャー


デフォルト設定では、Ansibleがすぐに機能しない可能性があることは周知の事実です。この記事では、これについていくつかの理由を指摘し、プロジェクトの速度を実際に向上させる、便利な最小限の設定を提供します。



ここで、さらに、新しく作成されたvirtualenvにお気に入りの方法でインストールされたAnsible2.9.xについて説明します。



インストール後、プレイブックの横にファイル「ansible.cfg」を作成します。この場所では、これらの設定をプロジェクトと一緒に転送でき、さらに自動的に読み込まれます。



パイプライニング



パイプライニングを使用する必要性について誰かがすでに聞いている可能性があります。つまり、モジュールをターゲットシステムのFSにコピーするのではなく、Base64でラップされたzipアーカイブをPythonインタープリターのstdinに直接転送しますが、事実は変わりません。 :この設定はまだ過小評価されています。残念ながら、デフォルトでsudoを構成するために使用される一般的なLinuxディストリビューションの一部は、あまりうまく機能しません。そのため、このコマンドにはtty(ターミナル)が必要でした。そのため、Ansibleでは、この非常に便利な設定がデフォルトで無効のままになりました。



pipelining = True


事実の収集



デフォルト設定では、プレイごとにAnsibleが、それに参加しているすべてのホストからファクトの収集を開始することをご存知ですか?一般的に、あなたが知らなかったなら、今あなたは知っています。これを防ぐには、ファクトを収集するための明示的要求モード(明示的)またはスマートモードのいずれかを有効にする必要があります。その中で、事実は以前の演劇で遭遇したことのないホストからのみ収集されます。

UPD。コピーするときは、これらの設定のいずれかを選択する必要があります。



gathering = smart|explicit


ssh接続の再利用



デバッグモードでAnsibleを起動したことがある場合(オプション「v」を1〜9回繰り返した場合)、ssh接続が常に確立されて切断されていることに気付いたかもしれません。したがって、ここにはいくつかの微妙な点もあります。



sshクライアントで直接、およびマネージャーから管理対象ホストにファイルを転送するときに、2つのレベルで一度にssh接続を再確立する段階を回避できます。

開いているssh接続を再利用するには、必要なキーをsshクライアントに渡すだけです。次に、彼は次のことを開始します。最初にssh接続を確立するときに、後続のソケットにいわゆる制御ソケットを追加で作成します。このソケットの存在を確認し、成功した場合は、既存のssh接続を再利用します。そして、これらすべてが理にかなっているように、非アクティブのときに接続を保存する時間を設定します。詳細については、sshのドキュメントを参照してください。Ansibleのコンテキストでは、必要なオプションをsshクライアントに「転送」するだけです。



ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"


管理対象ホストにファイルを転送するときに、すでに開いているssh接続を再利用するには、不明な設定ssh_tranfer_methodをもう1つ指定する必要があります。このオプションはそれ自体で機能するため、この問題に関するドキュメントは非常にまばらで誤解を招く可能性があります。ただし、ソースコードを読むと、正確に何が起こるかを理解できます。ddコマンドは、必要なファイルを直接操作して、管理対象ホストで起動されます。



transfer_method = piped


ちなみに、「開発」ブランチでは、この設定も存在し、どこにも行っいません



ナイフを恐れないでください、フォークを恐れてください



もう1つの便利な設定はフォークです。これは、ホストに同時に接続してタスクを実行するワーカープロセスの数を決定します。Pythonの特性により、プロセスはスレッドではなくPLとして使用されます。これは、Ansibleが引き続きPython 2.7をサポートしているためです。非同期はありません。ここでは、非同期性を生み出すものはありません。デフォルトでは、Ansibleは5つのワーカーを起動しますが、正しく要求された場合は、さらに実行されます。



forks = 20


制御マシンで使用可能なメモリ量に関連していくつかの問題が発生する可能性があることをすぐに警告します。言い換えれば、もちろん、フォーク= 100500を置くことができますが、誰がそれが機能すると言いましたか?



すべてを一緒に入れて



その結果、ansible.cfg(ini形式)の場合、必要な設定は次のようになります。



[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped


そして、健康な人の通常のYaMLインベントリにすべてを隠したい場合は、次のようになります。



---
all:
  vars:
    ansible_ssh_pipelining: true
    ansible_ssh_transfer_method: piped
    ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m


残念ながら、これは「gathering = smart / explicit」および「forks = 20」設定では機能しません。YaMLに相当するものはありません。それらをansible.cfgに設定するか、環境変数ANSIBLE_GATHERINGおよびANSIBLE_FORKSを介して渡します。



ミトゲンについて
— Mitogen? — , . — . , Mitogen, Ansible , , — , Mitogen . , , — .



Mitogen? , . — , : , « , ». , « ».



これらの設定の一部は、わかりやすい名前「ssh.py」で接続プラグインのソースコードを読み取っているときに発見されました読んだ結果を共有することで、他の誰かがソースを見て、読んで、実装を確認し、ドキュメントと比較するようになります。結局のところ、遅かれ早かれ、これらすべてがあなたに良い結果をもたらすでしょう。幸運を!



All Articles