Acelere o Ansible com Mitogen

O Ansible se tornou um dos sistemas mais populares de Gerenciamento de configuração . Após a compra da Red Hat em 2015, o número de participantes do projeto excedeu milhares e o Ansible foi provavelmente o sistema de implantação e orquestração mais utilizado. Suas amplas aplicações são muito impressionantes.


O Ansible funciona através de conexões SSH com hosts remotos. Ele abre uma sessão SSH, faz um 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 essa sequência de operações é bastante longa e tediosa, portanto, existem várias maneiras de otimizá-la.


Um desses métodos são os pipelines SSH, que permitem que você use uma sessão SSH para executar instruções, em vez de abrir uma nova sessão a cada vez, o que pode economizar muito tempo. (Lembre-se de desativar a configuração requiretty para sudo no seu arquivo /etc/sudoers na máquina remota)


Uma nova maneira de "fazer overclock" do Ansible é com uma biblioteca python chamada Mitogen . se alguém não ouviu falar, descreverei brevemente sua funcionalidade. Ele permite a rápida execução do código python em uma máquina remota, e o Ansible é apenas um caso de uso. O Mitogen usa um canal UNIX em uma máquina remota e passa zlib compactado com código python e serializado usando pickle. Isso ajuda a executá-lo mais rapidamente e economiza tráfego. Se você estiver interessado em uma explicação mais detalhada, é melhor ler sobre isso na página Como funciona . Mas hoje vamos nos concentrar apenas na biblioteca com Ansible.


O mitógeno, em certas circunstâncias, pode acelerar o 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 como isso nos ajuda.


Eu uso o Ansible ao máximo para: criar arquivos de configuração em uma máquina remota, instalar pacotes, copiar arquivos de e para uma máquina remota. Talvez você tenha outros exemplos - escreva nos comentários.


Vamos lá!


A configuração do Mitogen for Ansible é muito simples:
Instale a biblioteca Mitogen:


 pip install mitogen 

Agora, existem duas maneiras equivalentes - para configurar opções no arquivo de configuração ansible.cfg ou para definir as variáveis ​​de ambiente necessárias.


Suponha que o caminho para o Mitogen instalado seja /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 

Instale o Ansible no virtualenv, com e sem o 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)


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

Agora tente executar o manual criando arquivos na 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 execute com e sem Mitogen para criar 10 arquivos:


 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 uma melhoria de duas vezes. Vamos verificar 20, 30, ..., 100 arquivos:


 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 a execução em mais de 10 vezes!
Agora vamos tentar cenários diferentes e ver quanto mais rápido tudo funciona para nós:


  • Script para copiar arquivos para um host remoto do local (com módulo de copy ):
    Upload de arquivos


  • Script para criar arquivos em um host remoto com módulo de copy :
    Criando arquivos


  • Cenário com o download de arquivos de um host remoto para um local:
    Buscando arquivos


  • Script com a criação de modelos em um host dedicado com algumas variáveis ​​e cálculos no Jinja
    Arquivos de modelo



Vamos tentar um cenário com várias (3) máquinas remotas, por exemplo, um cenário com cópia de arquivos em um host remoto:
Upload de arquivos para vários hosts


Como você pode ver, o Mitogen economiza tempo e tráfego nesses cenários. Mas se o “gargalo” não estiver no Ansible, mas, por exemplo, em um disco ou rede de E / S, ou em outro lugar, é difícil esperar que o Mitogen nos ajude.


Vamos tentar um script para instalar pacotes com os módulos yum / dnf e python usando pip. Os pacotes foram armazenados em cache para não depender de falhas na 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 Mitogen, demorou 12 segundos, como sem ele.
Na página Mitogen for Ansible, você pode ver outros benchmarks e testes. Conforme indicado na página:


O Mitogen não pode acelerar um módulo quando ele é executado. Só pode tornar a execução deste módulo o mais rápido possível.

Portanto, é importante encontrar seus gargalos na implantação e, se forem devidos ao Ansible, o Mitogen o ajudará a resolvê-los e a acelerar significativamente a execução de seus playbooks.


editar: script adicionado com modelos

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


All Articles