Acelerando Ansible con Mitogen

Ansible converteuse nun dos máis populares Xestión da configuración do sistema. Despois foi comprado por Red Hat en 2015 o número participantes no proxecto superou os miles e Ansible converteuse probablemente no sistema de implementación e orquestración máis utilizado. A súa ampla gama de aplicacións é moi impresionante.

Ansible funciona mediante conexións SSH a hosts remotos. Abre unha sesión SSH, inicia sesión, copia o código de Python na rede e escríbeo nun ficheiro temporal separado. Despois diso, executa este ficheiro na máquina remota. Toda esta secuencia de operacións é bastante longa e tediosa, polo que hai varias formas de optimizala.

Unha destas formas é Condutos SSH que permite utilizar unha sesión SSH para executar instrucións, en lugar de abrir unha nova sesión cada vez, o que pode aforrarnos moito tempo. (Só lembre de apagar requiretty configuración para sudo no teu /etc/sudoers ficheiro na máquina remota)

Unha nova forma de facer overclock en Ansible é unha biblioteca Python chamada Mitóxeno. Se alguén non escoitou falar del, describirei brevemente a súa funcionalidade. Permite a execución rápida de código Python nunha máquina remota e Ansible é só un exemplo de uso. Mitogen usa un tubo UNIX na máquina remota e transfire código Python comprimido con zlib e serializado con pickle. Isto axuda a completalo máis rápido e aforra tráfico. Se estás interesado nunha explicación máis detallada, o mellor é ler sobre ela na páxina "Cómo funciona". Pero hoxe centrarémonos só en como funciona a biblioteca con Ansible.

Mitogen en determinadas circunstancias pode acelerar o seu código Ansible varias veces e reducir significativamente o consumo de tráfico. Vexamos os casos de uso máis populares e vexamos canto nos axudan.

Eu uso Ansible máis para: crear ficheiros de configuración nunha máquina remota, instalar paquetes, copiar ficheiros desde e desde a máquina remota. Quizais teñas outros exemplos: escribe nos comentarios.

Imos alí!

A configuración de Mitogen para Ansible é moi sinxela:
Instala a biblioteca Mitogen:

pip install mitogen

Agora hai dúas formas equivalentes: configurar as opcións no ficheiro de configuración ansible.cfg ou configurar as variables de ambiente necesarias.

Supoñamos que o camiño ao Mitogen instalado será /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Entón:

export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear

ou

[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy

Imos instalar Ansible en virtualenv, con e sen 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

Ten en conta que Mitogen 0.2.7 non funciona con Ansible 2.8 (a partir de maio de 2019)

Creación de alias:

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'

Agora imos tentar executar un playbook que cree ficheiros nunha máquina remota:

---
- 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 }}

E executémolo con e sen Mitogen para crear 10 ficheiros:

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

Vemos unha mellora dobre. Comprobamos que hai 2, 20, ..., 30 ficheiros:

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

Como resultado, aceleramos a execución máis de 10 veces.
Agora imos probar diferentes escenarios e ver canto máis rápido funciona todo para nós:

  • Script para copiar ficheiros a un host remoto desde un local (co módulo copy):
    Acelerando Ansible con Mitogen

  • Script para crear ficheiros nun host remoto con copy módulo:
    Acelerando Ansible con Mitogen

  • Escenario con descarga de ficheiros dun host remoto a un local:
    Acelerando Ansible con Mitogen

Probemos un escenario con varias (3) máquinas remotas, por exemplo un escenario con copiar ficheiros a un host remoto:
Acelerando Ansible con Mitogen

Como podes ver, Mitogen aforra tempo e tráfico nestes escenarios. Pero se o pescozo de botella non está en Ansible, senón, por exemplo, na E/S dun disco ou da rede, ou noutro lugar, é difícil esperar que Mitogen nos axude.

Probemos un script coa instalación de paquetes con módulos yum/dnf e python usando pip. Os paquetes foron almacenados na caché para non depender dos fallos da rede:

---
- 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

Con Mitogen tardou 12 segundos, o mesmo que sen el.
Na páxina Mitogen para páxina Ansible podes mirar outros puntos de referencia e probas. Como indica a páxina:

Mitogen non pode acelerar o módulo cando se está a executar. Só pode facer que a execución deste módulo sexa o máis rápida posible.

Polo tanto, é importante atopar os teus pescozos de botella na túa implementación e, se son debido a Ansible, Mitogen axudarache a resolvelos e acelerará significativamente a execución dos teus libros de xogo.

Fonte: www.habr.com

Engadir un comentario