Ускоряем Ansible с помощью Mitogen

15 ИЮНЯ 2022

------------------------------------------------------------------------

Наш телеграм-канал: t.me/@mailsgun_online

Youtube: youtube.com/@mailsgun_online

------------------------------------------------------------------------

  • Tutorial

Ansible стал одним из самых популярных 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):
    Uploading files

  • Сценарий создания файлов на удаленном хосте с copy модулем:
    Creating files

  • Сценарий с загрузкой файлов с удаленного хоста на локальный:
    Fetching files

Попробуем сценарий с несколькими (3) удаленными машинами, например сценарий с копированием файлов на удаленный хост:
Uploading files to multiple hosts

Как видно 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.

Теги:

Source: habr1

Ну и напоследок напоминаю вам о нашем новом проекте vkserfing bot.