Ansible funciona em conexões SSH com hosts remotos. Ele abre uma sessão SSH, faz login, copia o código Python pela rede e grava-o em um arquivo temporário separado. Depois disso, ele executa esse arquivo na máquina remota. Toda esta sequência de operações é bastante longa e tediosa, por isso existem várias maneiras de otimizá-la.
Uma dessas maneiras é requiretty
configuração para sudo em seu /etc/sudoers
arquivo na máquina remota)
Uma nova maneira de fazer overclock do Ansible é uma biblioteca python chamada
O Mitogen, em certas circunstâncias, pode acelerar seu código Ansible várias vezes e reduzir significativamente o consumo de tráfego. Vamos verificar os casos de uso mais populares e ver o quanto isso nos ajuda.
Eu uso o Ansible principalmente para: criar arquivos de configuração em uma máquina remota, instalar pacotes, copiar arquivos de e para a máquina remota. Talvez você tenha outros exemplos - escreva nos comentários.
Vamos lá!
A configuração do Mitogen para Ansible é muito simples:
Instale a biblioteca Mitogen:
pip install mitogen
Agora existem duas maneiras equivalentes: configurar as opções no arquivo de configuração ansible.cfg ou definir as variáveis de ambiente necessárias.
Vamos supor que o caminho para o Mitogen instalado será /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. Então:
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
Vamos instalar o Ansible no virtualenv, com e sem 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
Observe que o Mitogen 0.2.7 não funciona com o Ansible 2.8 (em maio de 2019)
Criando apelidos:
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 vamos tentar executar um manual que cria arquivos em uma 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 vamos executá-lo com e sem Mitogen para criar 10 arquivos:
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 uma melhoria de 2 vezes. Vamos verificar 20, 30, ..., 100 arquivos:
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 execução em mais de 10 vezes!
Agora vamos tentar diferentes cenários e ver como tudo funciona mais rápido para nós:
-
Script para copiar arquivos para um host remoto de um local (com o módulo
copy
):
-
Script para criar arquivos em um host remoto com
copy
módulo:
-
Cenário com download de arquivos de um host remoto para um local:
Vamos tentar um cenário com várias (3) máquinas remotas, por exemplo, um cenário com cópia de arquivos para um host remoto:
Como você pode ver, o Mitogen nos economiza tempo e tráfego nesses cenários. Mas se o gargalo não estiver no Ansible, mas, por exemplo, na E/S de um disco ou rede, ou em outro lugar, então é difícil esperar que o Mitogen nos ajude.
Vamos tentar um script com instalação de pacotes com módulos yum/dnf e python usando pip. Os pacotes foram armazenados em cache para não depender de falhas de 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
Com o Mitogen demorou 12 segundos, o mesmo que sem ele.
Na página
O Mitogen não pode acelerar o módulo quando ele está em execução. Só pode tornar a execução deste módulo o mais rápida possível.
Portanto, é importante encontrar seus gargalos em sua implantação e, se eles forem devidos ao Ansible, o Mitogen o ajudará a resolvê-los e a acelerar significativamente a execução de seus playbooks.
Fonte: habr.com