使用 Mitogen 加速 Ansible

Ansible 成為最受歡迎的之一 系統配置管理。 後 被紅帽收購 2015年數量 計畫參與者 超過數千,Ansible 可能成為最常用的部署和編排系統。 其廣泛的應用範圍令人印象深刻。

Ansible 透過與遠端主機的 SSH 連線進行工作。 它打開 SSH 會話、登入、透過網路複製 Python 程式碼並將其寫入單獨的臨時檔案。 之後,它在遠端電腦上運行該文件。 整個操作序列相當長且乏味,因此有多種方法可以對其進行最佳化。

其中一種方法是 SSH 管道 它允許你使用一個 SSH 會話來執行指令,而不是每次打開一個新會話,這可以節省我們很多時間。 (只要記得關掉 requiretty 在你的 sudo 設置 /etc/sudoers 遠端電腦上的文件)

超頻 Ansible 的新方法是一個名為的 Python 函式庫 有絲分裂原。 如果有人還沒有聽說過它,我將簡要描述它的功能。 它允許在遠端電腦上快速執行 python 程式碼,Ansible 只是使用範例之一。 Mitogen 在遠端電腦上使用 UNIX 管道,並傳輸使用 zlib 壓縮並使用 pickle 序列化的 python 程式碼。 這有助於更快地完成並節省流量。 如果您有興趣更詳細的解釋,最好閱讀頁面上的內容 “怎麼運行的”。 但今天我們將只關注該庫如何與 Ansible 配合使用。

Mitogen 在某些情況下可以將 Ansible 程式碼加速數倍並顯著減少流量消耗。 讓我們看看最受歡迎的用例,看看它對我們有多大幫助。

我最常使用 Ansible:在遠端電腦上建立設定檔、安裝軟體包、將檔案複製到遠端電腦或從遠端電腦複製檔案。 也許你還有其他例子 - 請寫在評論中。

我們走吧!

Ansible 的 Mitogen 設定非常簡單:
安裝 Mitogen 庫:

pip install mitogen

現在有兩種等效的方法 - 要么配置 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

讓我們在 virtualenv 中安裝 Ansible,有或沒有 Mitogen:

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'

現在讓我們嘗試運行一個在遠端電腦上建立文件的劇本:

---
- 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

讓我們嘗試一個具有多 (3) 台遠端電腦的場景,例如將檔案複製到遠端主機的場景:
使用 Mitogen 加速 Ansible

正如您所看到的,Mitogen 在這些場景中為我們節省了時間和流量。 但如果瓶頸不在 Ansible 中,而是在磁碟或網路的 I/O 或其他地方,那麼很難指望 Mitogen 能夠幫助我們。

讓我們嘗試使用 pip 安裝包含 yum/dnf 和 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 您可以查看其他基準測試和測試。 正如頁面所述:

Mitogen 運作時無法加速模組。 它只能讓這個模組的執行速度盡可能的快。

因此,找到部署中的瓶頸非常重要,如果這些瓶頸是由 Ansible 造成的,那麼 Mitogen 將幫助您解決它們並顯著加快 playbook 的執行速度。

來源: www.habr.com

添加評論