Ускоряваме Ansible с Mitogen

Ansible стана един от най-популярните системи за управление на конфигурации. След като беше закупен от 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. Това помага за по-бързо изпълнение и спестява трафик. Ако вас ви интересува по-подробно обяснение, най-добре е да прочетете за това на страницата „Как работи“. Но днес ще се фокусираме само на работата на библиотеката с 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):
    Ускоряваме 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: Инсталиране на пакети
      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 for Ansible page можете да разгледате и други бенчмаркове и тестове. Както е посочено на страницата:

Mitogen не може да ускори модула, когато той се изпълнява. Той може само да направи изпълнението на този модул толкова бързо, колкото е възможно.

Затова е важно да намерите вашите тесни места в разгръщането и ако те са резултат от Ansible, Mitogen ще ви помогне да ги разрешите и значително да ускори изпълнението на вашите playbooks.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster