Acelerando o Ansible com Mitogen

Ansible tornou-se um dos mais populares Gerenciamento de configuração do sistema. Depois foi comprado pela Red Hat em 2015 o número participantes do projeto ultrapassou milhares e o Ansible tornou-se provavelmente o sistema de implantação e orquestração mais usado. Sua ampla gama de aplicações é muito impressionante.

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 é Pipelines SSH que permite usar uma sessão SSH para executar instruções, em vez de abrir uma nova sessão a cada vez, o que pode nos poupar muito tempo. (Lembre-se de desligar 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 Mitógeno. Se alguém ainda não ouviu falar dele, descreverei brevemente sua funcionalidade. Ele permite a execução rápida de código python em uma máquina remota, e Ansible é apenas um exemplo de uso. Mitogen usa um pipe UNIX na máquina remota e transfere código python compactado com zlib e serializado com pickle. Isso ajuda a concluí-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 em como a biblioteca funciona com o Ansible.

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):
    Acelerando o Ansible com Mitogen

  • Script para criar arquivos em um host remoto com copy módulo:
    Acelerando o Ansible com Mitogen

  • Cenário com download de arquivos de um host remoto para um local:
    Acelerando o Ansible com Mitogen

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:
Acelerando o Ansible com Mitogen

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 Página Mitógeno para Ansible você pode consultar outros benchmarks e testes. Como afirma a 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

Adicionar um comentário