Mitogen を使用して Ansible を高速化する

Ansible 最も人気のあるもののXNUMXつになりました システム構成管理。 後 Red Hat によって買収されました 2015年の数字 プロジェクト参加者 その数は数千を超え、Ansible はおそらく最もよく使用されるデプロイメントおよびオーケストレーション システムになりました。 その応用範囲の広さは非常に印象的です。

Ansible は、リモート ホストへの SSH 接続を介して動作します。 SSH セッションを開き、ログインし、ネットワーク経由で Python コードをコピーし、別の一時ファイルに書き込みます。 その後、このファイルをリモート マシン上で実行します。 この一連の操作は非常に長くて退屈なため、最適化する方法はさまざまです。

これらの方法の XNUMX つは、 SSH パイプライン これにより、毎回新しいセッションを開くのではなく、XNUMX つの SSH セッションを使用して命令を実行できるため、時間を大幅に節約できます。 (忘れずにオフにしてください requiretty sudoの設定 /etc/sudoers リモートマシン上のファイル)

Ansible をオーバークロックする新しい方法は、と呼ばれる Python ライブラリです。 マイトジェン。 聞いたことのない人のために、その機能について簡単に説明します。 これにより、リモート マシン上で Python コードを高速に実行できます。Ansible は使用例の XNUMX つにすぎません。 Mitogen はリモート マシン上の UNIX パイプを使用し、zlib で圧縮され、pickle でシリアル化された Python コードを転送します。 これにより、処理をより速く完了し、トラフィックを節約できます。 より詳細な説明に興味がある場合は、ページでそれについて読むことをお勧めします "使い方"。 ただし、今日は、ライブラリが Ansible とどのように連携するかにのみ焦点を当てます。

特定の状況では、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):
    Mitogen を使用して Ansible を高速化する

  • リモートホスト上にファイルを作成するためのスクリプト copy モジュール:
    Mitogen を使用して Ansible を高速化する

  • リモート ホストからローカル ホストにファイルをダウンロードするシナリオ:
    Mitogen を使用して Ansible を高速化する

複数のリモート マシンを使用したシナリオ、たとえばファイルをリモート ホストにコピーするシナリオを試してみましょう。
Mitogen を使用して Ansible を高速化する

ご覧のとおり、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 秒かかりました。
ページ上 Ansible のマイトジェンページ 他のベンチマークやテストを確認することができます。 ページには次のように記載されています。

Mitogen は、モジュールの実行中に速度を上げることができません。 このモジュールの実行を可能な限り高速化することのみが可能です。

したがって、デプロイメント内のボトルネックを見つけることが重要であり、そのボトルネックが Ansible に起因する場合は、Mitogen がボトルネックの解決に役立ち、プレイブックの実行を大幅に高速化します。

出所: habr.com

コメントを追加します