УскоряСм Ansible с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Mitogen

Ansible стал ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых популярных Configuration Management систСм. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±Ρ‹Π» ΠΊΡƒΠΏΠ»Π΅Π½ Red Hat Π² 2015 Π³ΠΎΠ΄Ρƒ число участников ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° прСвысило тысячи ΠΈ Ansible стал Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅ самым ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ систСмой развСртывания ΠΈ оркСстрации. Π•Π³ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΈΠ΅ области примСнСния ΠΎΡ‡Π΅Π½ΡŒ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‚.

Ansible Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· SSH соСдинСния ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ хостам. Он ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ SSH сСссию, Π΄Π΅Π»Π°Π΅Ρ‚ Π»ΠΎΠ³ΠΈΠ½, ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π½Π° Python ΠΏΠΎ сСти ΠΈ записываСт Π΅Π³ΠΎ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». ПослС этого ΠΎΠ½ запускаСт этот Ρ„Π°ΠΉΠ» Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС. Вся эта ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ довольно долгая ΠΈ нудная, поэтому ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Одним ΠΈΠ· этих способов являСтся SSH pipelines ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ SSH сСссию для исполнСния инструкций, Π° Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½ΠΎΠ²ΡƒΡŽ сСссию, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. (Волько Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ requiretty настройку для sudo Π² вашСм /etc/sudoers Ρ„Π°ΠΉΠ»Π΅ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС)

Новым способом «Ρ€Π°Π·ΠΎΠ³Π½Π°Ρ‚ΡŒ» Ansible являСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° python ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Mitogen. Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΎ Π½Π΅ΠΉ Π½Π΅ ΡΠ»Ρ‹ΡˆΠ°Π» β€” Ρ‚ΠΎ Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ ΠΎΠΏΠΈΡˆΡƒ Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Она позволяСт быстроС исполнСниС ΠΊΠΎΠ΄Π° python Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС ΠΈ Ansible это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования. Mitogen ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ UNIX pipe Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄ python сТатый zlib ΠΈ сСриализованный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pickle. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ быстрСС ΠΈ экономит Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. Если Π²Ρ‹ заинтСрСсованы Π² Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΌ объяснСнии, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ± этом Π½Π° страницС «How it works». Но сСгодня ΠΌΡ‹ сфокусируСмся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с Ansible.

Mitogen Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ваш Ansible ΠΊΠΎΠ΄ Π² нСсколько Ρ€Π°Π· ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ расход Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ самыС популярныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования ΠΈ посмотрим насколько Π½Π°ΠΌ это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚.

Π― большС всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Ansible для: создания Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС, установка ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ β€” Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях.

ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ!

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Mitogen для Ansible ΠΎΡ‡Π΅Π½ΡŒ проста:
УстанавливаСм 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

Установим Ansible Π² virtualenv, с 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)

Π”Π΅Π»Π°Π΅ΠΌ aliases:

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):
    УскоряСм Ansible с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Mitogen

  • Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ создания Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ хостС с copy ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ:
    УскоряСм Ansible с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Mitogen

  • Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ с Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ² с ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ хоста Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ:
    УскоряСм Ansible с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Mitogen

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ сцСнарий с нСсколькими (3) ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌΠΈ машинами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сцСнарий с ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ хост:
УскоряСм Ansible с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Mitogen

Как Π²ΠΈΠ΄Π½ΠΎ Mitogen экономит Π½Π°ΠΌ ΠΊΠ°ΠΊ врСмя Ρ‚Π°ΠΊ ΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π² этих сцСнариях. Но Ссли «Π±ΡƒΡ‚Ρ‹Π»ΠΎΡ‡Π½ΠΎΠ΅ Π³ΠΎΡ€Π»Ρ‹ΡˆΠΊΠΎ» Π½Π΅ Π² Ansible, Π° Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² I/O диска ΠΈΠ»ΠΈ сСти, ΠΈΠ»ΠΈ Π³Π΄Π΅ Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅, Ρ‚ΠΎΠ³Π΄Π° Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Mitogen Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ сцСнарий с установкой ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с yum/dnf ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ Π·Π°ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ глюков Π² сСти:

---
- 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 for Ansible page Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈ ΠΈ тСсты. Как утвСрТдаСтся Π½Π° страницС:

Mitogen Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ исполняСтся. Он ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ исполнСниС этого модуля Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ быстрым насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Π°ΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ваши ΡƒΠ·ΠΊΠΈΠ΅ мСста Π² Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ ΠΈ Ссли ΠΎΠ½ΠΈ ΠΈΠ·-Π·Π° Ansible, Ρ‚ΠΎ Mitogen ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΡ… ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ исполнСниС Π²Π°ΡˆΠΈΡ… playbooks.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com