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 é 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
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
):
-
Script para crear ficheiros nun host remoto con
copy
módulo:
-
Escenario con descarga de ficheiros dun host remoto a un local:
Probemos un escenario con varias (3) máquinas remotas, por exemplo un escenario con copiar ficheiros a un host remoto:
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 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