Ansible は、リモート ホストへの SSH 接続を介して動作します。 SSH セッションを開き、ログインし、ネットワーク経由で Python コードをコピーし、別の一時ファイルに書き込みます。 その後、このファイルをリモート マシン上で実行します。 この一連の操作は非常に長くて退屈なため、最適化する方法はさまざまです。
これらの方法の XNUMX つは、 requiretty
sudoの設定 /etc/sudoers
リモートマシン上のファイル)
Ansible をオーバークロックする新しい方法は、と呼ばれる Python ライブラリです。
特定の状況では、Mitogen は Ansible コードを数倍高速化し、トラフィック消費を大幅に削減できます。 最も一般的な使用例をチェックして、それがどれほど役立つかを見てみましょう。
私が Ansible を最もよく使用するのは、リモート マシンでの構成ファイルの作成、パッケージのインストール、リモート マシンとの間でのファイルのコピーです。 おそらく他の例があるかもしれません - コメントに書いてください。
行こう!
Ansible の Mitogen 構成は非常に簡単です。
Mitogen ライブラリをインストールします。
pip install mitogen
現在、同等の方法が XNUMX つあります - ansible.cfg 構成ファイルでオプションを構成するか、必要な環境変数を設定します。
インストールされた Mitogen へのパスが次のようになると仮定します。 /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. それで:
export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear
または
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
Mitogen を使用する場合と使用しない場合で、Ansible を virtualenv にインストールしてみましょう。
virtualenv mitogen_ansible
./mitogen_ansible/bin/pip install ansible==2.7.10 mitogen
virtualenv pure_ansible
./pure_ansible/bin/pip install ansible==2.7.10
Mitogen 0.2.7 は Ansible 2.8 では動作しないことに注意してください (2019 年 XNUMX 月現在)
エイリアスの作成:
alias pure-ansible-playbook='$(pwd)/pure_ansible/bin/ansible-playbook'
alias mitogen-ansible-playbook='ANSIBLE_STRATEGY_PLUGINS=$(pwd)/mitogen_ansible/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy ANSIBLE_STRATEGY=mitogen_linear $(pwd)/mitogen_ansible/bin/ansible-playbook'
次に、リモート マシン上でファイルを作成する Playbook を実行してみましょう。
---
- hosts: all
gather_facts: false
tasks:
- name: Create files with copy content module
copy:
content: |
test file {{ item }}
dest: ~/file_{{ item }}
with_sequence: start=1 end={{ n }}
そして、Mitogen を使用した場合と使用しない場合で実行して、10 個のファイルを作成してみましょう。
time mitogen-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null
real 0m2.603s
user 0m1.152s
sys 0m0.096s
time pure-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null
real 0m5.908s
user 0m1.745s
sys 0m0.643s
2 倍の改善が見られます。 20、30、...、100 個のファイルをチェックしてみましょう。
time pure-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null
real 0m51.775s
user 0m8.039s
sys 0m6.305s
time mitogen-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null
real 0m4.331s
user 0m1.903s
sys 0m0.197s
その結果、実行が 10 倍以上高速化されました。
次に、さまざまなシナリオを試して、すべてがどれだけ高速に動作するかを確認してみましょう。
-
ファイルをローカルホストからリモートホストにコピーするためのスクリプト (モジュールを使用)
copy
):
-
リモートホスト上にファイルを作成するためのスクリプト
copy
モジュール:
-
リモート ホストからローカル ホストにファイルをダウンロードするシナリオ:
複数のリモート マシンを使用したシナリオ、たとえばファイルをリモート ホストにコピーするシナリオを試してみましょう。
ご覧のとおり、Mitogen はこれらのシナリオで時間とトラフィックの両方を節約します。 しかし、ボトルネックが Ansible 内ではなく、たとえばディスクやネットワークの I/O などにある場合、Mitogen が役立つことを期待するのは困難です。
yum/dnf を使用してパッケージをインストールし、pip を使用して Python モジュールをインストールするスクリプトを試してみましょう。 パッケージは、ネットワークの不具合に依存しないようにキャッシュされました。
---
- hosts: all
gather_facts: false
tasks:
- name: Install packages
become: true
package:
name:
- samba
- httpd
- nano
- ruby
state: present
- name: Install pip modules
become: true
pip:
name:
- pytest-split-tests
- bottle
- pep8
- flask
state: present
Mitogen を使用すると、使用しない場合と同じ 12 秒かかりました。
ページ上
Mitogen は、モジュールの実行中に速度を上げることができません。 このモジュールの実行を可能な限り高速化することのみが可能です。
したがって、デプロイメント内のボトルネックを見つけることが重要であり、そのボトルネックが Ansible に起因する場合は、Mitogen がボトルネックの解決に役立ち、プレイブックの実行を大幅に高速化します。
出所: habr.com