стана един от най-популярните . След като през 2015 година броят на надхвърли хиляди и Ansible стана вероятно най-използваната система за разгръщане и оркестрация. Широките му области на приложение са изключително впечатляващи.
Ansible работи чрез SSH връзки с отдалечени хостове. Той отваря SSH сесия, влиза, копира Python код през мрежата и го записва в отделен временен файл. След това той изпълнява този файл на отдалечената машина. Цялата тази последователност от операции е доста бавна и тромава, затова съществуват различни начини за оптимизация.
Един от тези начини е който позволява използването на една SSH сесия за изпълнение на инструкции, вместо да отваряме нова сесия всеки път, което може да спести много време. (Само не забравяйте да деактивирате requiretty настройката за sudo във вашия /etc/sudoers файл на отдалечената машина)
Новият начин за „ускоряване“ на Ansible е библиотеката python с името . ако някой не е чувал за нея — накратко ще опиша нейната функционалност. Тя позволява бързо изпълнение на Python код на отдалечена машина и Ansible е само един от примерите за употреба. Mitogen използва UNIX pipe на отдалечената машина и предава Python кода компресиран с zlib и сериализиран с помощта на pickle. Това помага за по-бързо изпълнение и спестява трафик. Ако вас ви интересува по-подробно обяснение, най-добре е да прочетете за това на страницата . Но днес ще се фокусираме само на работата на библиотеката с 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)
Създаваме псевдоними:
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: Създаване на файлове с модула copy
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: Инсталиране на пакети
become: true
package:
name:
- samba
- httpd
- nano
- ruby
state: present
- name: Инсталиране на pip модули
become: true
pip:
name:
- pytest-split-tests
- bottle
- pep8
- flask
state: present
С Mitogen това отне 12 секунди, както и без него.
На страницата можете да разгледате и други бенчмаркове и тестове. Както е посочено на страницата:
Mitogen не може да ускори модула, когато той се изпълнява. Той може само да направи изпълнението на този модул толкова бързо, колкото е възможно.
Затова е важно да намерите вашите тесни места в разгръщането и ако те са резултат от Ansible, Mitogen ще ви помогне да ги разрешите и значително да ускори изпълнението на вашите playbooks.
Източник: habr.com
