Прискорюємо 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

Додати коментар або відгук