Acelera Ansible con Mitogen

Ansible se ha convertido en uno de los sistemas de gestión de configuración más populares. Después de comprar Red Hat en 2015, el número de participantes en el proyecto superó los miles y Ansible fue probablemente el sistema de implementación y orquestación más utilizado. Sus amplias aplicaciones son muy impresionantes.


Ansible funciona a través de conexiones SSH a hosts remotos. Abre una sesión SSH, inicia sesión, copia el código de Python a través de la red y lo escribe en un archivo temporal separado. Después de eso, ejecuta este archivo en la máquina remota. Toda esta secuencia de operaciones es bastante larga y tediosa, por lo que hay varias formas de optimizarla.


Uno de estos métodos son las tuberías SSH que le permiten usar una sesión SSH para ejecutar instrucciones, en lugar de abrir una nueva sesión cada vez, lo que puede ahorrarnos mucho tiempo. (Solo recuerde deshabilitar la configuración requiretty para sudo en su /etc/sudoers en la máquina remota)


Una nueva forma de "overclockear" Ansible es con una biblioteca de Python llamada Mitogen . Si alguien no ha oído hablar de él, describiré brevemente su funcionalidad. Permite la ejecución rápida de código python en una máquina remota, y Ansible es solo un caso de uso. Mitogen usa una tubería UNIX en una máquina remota y pasa código python comprimido zlib y serializado usando pickle. Esto ayuda a ejecutarlo más rápido y ahorra tráfico. Si está interesado en una explicación más detallada, es mejor leerla en la página Cómo funciona . Pero hoy nos centraremos solo en la biblioteca con Ansible.


Mitogen en ciertas circunstancias puede acelerar su código Ansible varias veces y reducir significativamente el consumo de tráfico. Veamos los casos de uso más populares y veamos cómo esto nos ayuda.


Yo uso más Ansible para: crear archivos de configuración en una máquina remota, instalar paquetes, copiar archivos ay desde una máquina remota. Quizás tenga otros ejemplos: escriba en los comentarios.


Vamos!


La configuración de Mitogen para Ansible es muy simple:
Instale la biblioteca Mitogen:


 pip install mitogen 

Ahora hay dos formas equivalentes: configurar las opciones en el archivo de configuración ansible.cfg o establecer las variables de entorno necesarias.


Suponga que la ruta al Mitogen instalado es /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy . Entonces:


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

o


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

Instale Ansible en virtualenv, con y sin 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 

Tenga en cuenta que Mitogen 0.2.7 no funciona con Ansible 2.8 (a partir de mayo de 2019)


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

Ahora intente ejecutar el libro de jugadas creando archivos en la 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 }} 

Y ejecute con y sin Mitogen para crear 10 archivos:


 time mitogen-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m2.603s user 0m1.152s sys 0m0.096s time pure-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m5.908s user 0m1.745s sys 0m0.643s 

Vemos una mejora de 2 veces. Vamos a ver por 20, 30, ..., 100 archivos:


 time pure-ansible-playbook file_creation.yml -i hosts -en=100 &>/dev/null real 0m51.775s user 0m8.039s sys 0m6.305s time mitogen-ansible-playbook file_creation.yml -i hosts -en=100 &>/dev/null real 0m4.331s user 0m1.903s sys 0m0.197s 

Como resultado, ¡aceleramos la ejecución más de 10 veces!
Ahora intentemos diferentes escenarios y veamos qué tan rápido todo funciona para nosotros:


  • Script para copiar archivos a un host remoto desde local (con módulo de copy ):
    Subiendo archivos


  • Script para crear archivos en un host remoto con módulo de copy :
    Creando archivos


  • Escenario con la descarga de archivos desde un host remoto a uno local:
    Obteniendo archivos


  • Script con creación de plantillas en un host dedicado con algunas variables y cálculos en Jinja
    Archivos de plantilla



Probemos un escenario con varias (3) máquinas remotas, por ejemplo, un escenario con copia de archivos a un host remoto:
Subir archivos a varios hosts


Como puede ver, Mitogen nos ahorra tiempo y tráfico en estos escenarios. Pero si el "cuello de botella" no está en Ansible, sino, por ejemplo, en un disco o red de E / S, o en otro lugar, es difícil esperar que Mitogen nos ayude.


Probemos un script para instalar paquetes con módulos yum / dnf y python usando pip. Los paquetes se almacenaron en caché para no depender de fallas en la red:


 --- - 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, tardó 12 segundos, como sin él.
En la página Mitogen para Ansible, puede ver otros puntos de referencia y pruebas. Como se indica en la página:


Mitogen no puede acelerar un módulo cuando se ejecuta. Solo puede hacer que la ejecución de este módulo sea lo más rápida posible.

Por lo tanto, es importante encontrar los cuellos de botella en la implementación y, si se deben a Ansible, Mitogen lo ayudará a resolverlos y a acelerar significativamente la ejecución de sus libros de jugadas.


editar: secuencia de comandos agregada con plantillas

Source: https://habr.com/ru/post/453520/


All Articles