Паскараем Ansible з дапамогай Mitogen

анзибль стаў адным з самых папулярных 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

Дадаць каментар