Ansible працює через SSH з'єднання до віддалених хостів. Він відкриває сесію SSH, робить логін, копіює код на Python по мережі і записує його в окремий тимчасовий файл. Після цього він запускає файл на віддаленій машині. Вся ця послідовність операцій є досить довгою і нудною, тому існують різні способи її оптимізувати.
Одним із цих способів є requiretty
налаштування для sudo у вашому /etc/sudoers
файлі на віддаленій машині)
Новим способом «розігнати» Ansible є python бібліотека на ім'я
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
):
-
Сценарій створення файлів на віддаленому хості з
copy
модулем:
-
Сценарій із завантаженням файлів із віддаленого хоста на локальний:
Спробуємо сценарій з кількома віддаленими машинами (3), наприклад сценарій з копіюванням файлів на віддалений хост:
Як видно 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 не може прискорити модуль, коли він виконується. Він може тільки зробити виконання цього модуля настільки швидким, наскільки це можливо.
Тому важливо знайти ваші вузькі місця в розгортанні і якщо вони через Ansible, Mitogen допоможе вам вирішити їх і значно прискорити виконання ваших playbooks.
Джерело: habr.com