Acelerando Ansible con Mitogen

Ansible se convirtió en uno de los más populares sistemas de Gestión de Configuración. Después de que fue comprado por Red Hat en 2015, el número de participantes en el proyecto superó miles y Ansible se volvió quizás el sistema de despliegue y orquestación más utilizado. Sus amplias áreas de aplicación son realmente impresionantes.

Ansible funciona a través de conexiones SSH a hosts remotos. Abre una sesión SSH, inicia sesión, copia el código en Python a través de la red y lo guarda en un archivo temporal. Después de esto, ejecuta este archivo en la máquina remota. Todo este proceso puede ser bastante lento y tedioso, por lo que existen diferentes maneras de optimizarlo.

Una de estas maneras es los pipelines SSH que permiten usar una sola sesión SSH para ejecutar instrucciones, en lugar de abrir una nueva sesión cada vez, lo que puede ahorrarnos mucho tiempo. (Recuerde deshabilitar requiretty en la configuración para sudo en su /etc/sudoers archivo en la máquina remota)

Una nueva forma de ‘acelerar’ Ansible es la biblioteca de Python llamada Mitogen. Si alguien no ha oído hablar de ella, en resumen, describiré su funcionalidad. Permite ejecutar código Python rápidamente en la máquina remota y Ansible es solo uno de los ejemplos de uso. Mitogen utiliza un pipe de UNIX en la máquina remota y transfiere el código Python comprimido con zlib y serializado con 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 leer sobre ello en la página ‘Cómo funciona’. Pero hoy nos centraremos solo en el trabajo de la biblioteca con Ansible.

Mitogen, en ciertas circunstancias, puede acelerar su código Ansible varias veces y disminuir significativamente el consumo de tráfico. Vamos a revisar los ejemplos de uso más populares y ver cuánto nos ayuda.

Yo uso Ansible principalmente para: crear archivos de configuración en una máquina remota, instalar paquetes, copiar archivos hacia y desde la máquina remota. Puede que tenga otros ejemplos; escríbalo en los comentarios.

¡Vamos!

La configuración de Mitogen para Ansible es muy sencilla:
Instalamos la biblioteca Mitogen:

pip install mitogen

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

Supongamos que la ruta a Mitogen instalado será /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

Instalaremos Ansible en un virtualenv, con Mitogen y sin ella:

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 (en mayo de 2019)

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

Ahora intentaremos ejecutar un playbook que crea archivos en una máquina remota:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Crear archivos con el módulo de contenido de copia
      copy:
        content: |
          archivo de prueba {{ item }}
        dest: ~\/file_{{ item }}
      with_sequence: start=1 end={{ n }}

Y lo ejecutaremos con Mitogen y sin ella para crear 10 archivos:

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 una mejora de 2 veces. Ahora verifiquemos para 20, 30, …, 100 archivos:

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

¡En total, aceleramos la ejecución más de 10 veces!
Ahora probemos diversos escenarios y veamos cuán rápido funciona todo:

  • Escenario de copiado de archivos en un host remoto desde local (con el módulo copy):
    Acelerando Ansible con Mitogen

  • Escenario de creación de archivos en un host remoto con copy módulo:
    Acelerando Ansible con Mitogen

  • Escenario de descarga de archivos desde un host remoto a local:
    Acelerando Ansible con Mitogen

Intentaremos un escenario con varias (3) máquinas remotas, por ejemplo, un escenario de copiado de archivos en un host remoto:
Acelerando Ansible con Mitogen

Como se puede ver, Mitogen nos ahorra tanto tiempo como tráfico en estos escenarios. Pero si el "cuello de botella" no está en Ansible, sino en I/O del disco o en la red, o en cualquier otra parte, entonces es difícil esperar que Mitogen nos ayude.

Probemos un escenario de instalación de paquetes con yum/dnf y módulos de python usando pip. Los paquetes fueron cacheados para no depender de fallos de red:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Instalar paquetes
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Instalar módulos de pip
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Con Mitogen tomó 12 segundos, al igual que sin él.
En la página Mitogen para la página de Ansible puede ver otros benchmarks y pruebas. Como se afirma en la página:

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

Por lo tanto, es importante encontrar sus cuellos de botella en el despliegue y si son causados por Ansible, Mitogen le ayudará a resolverlos y acelerará significativamente la ejecución de sus playbooks.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster