se convirtió en uno de los más populares . Después de que en 2015, el número de 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 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 . 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 . 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 mitogenAhora 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_linearo
[defaults]
strategy = mitogen_linear
strategy_plugins = \/usr\/lib\/python2.7\/site-packages\/ansible_mitogen\/plugins\/strategyInstalaremos 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.10Tenga 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.643sVemos 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):
Escenario de creación de archivos en un host remoto con
copymódulo:
Escenario de descarga de archivos desde un host remoto a local:
Intentaremos un escenario con varias (3) máquinas remotas, por ejemplo, un escenario de copiado de archivos en un host remoto:
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 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
