Acelerando o Ansible com Mitogen

Ansible tornou-se um dos mais populares sistemas de Gerenciamento de Configuração. Depois que foi comprado pela Red Hat em 2015, o número de participantes do projeto superou mil e o Ansible tornou-se provavelmente o sistema de implantação e orquestração mais utilizado. Suas amplas áreas de aplicação são bastante impressionantes.

O Ansible funciona através de conexões SSH para 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. Todo esse processo é bastante longo e tedioso, por isso existem várias maneiras de otimizá-lo.

Uma dessas maneiras é tubos SSH que permite usar uma única sessão SSH para executar instruções, em vez de abrir uma nova sessão a cada vez, o que pode nos economizar muito tempo. (Apenas não se esqueça de desativar requiretty na configuração para sudo em seu /etc/sudoers arquivo na máquina remota)

Uma nova maneira de "acelerar" o Ansible é a biblioteca python chamada Mitogen. Se alguém não ouviu falar, vou resumir sua funcionalidade. Ela permite a execução rápida de código Python na máquina remota e o Ansible é apenas um dos exemplos de uso. O Mitogen usa pipe UNIX na máquina remota e transmite código Python compactado em zlib e serializado com pickle. Isso ajuda a executá-lo mais rapidamente e economiza tráfego. Se você estiver interessado em uma explicação mais detalhada, o melhor é ler sobre isso na página "Como funciona". Mas hoje vamos nos concentrar apenas no funcionamento da biblioteca 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 exemplos de uso mais populares e ver como isso nos ajuda.

Eu mais uso o Ansible para: criação de arquivos de configuração na máquina remota, instalação de pacotes, cópia de arquivos para a máquina remota e vice-versa. Talvez você tenha outros exemplos — escreva nos comentários.

Vamos lá!

A configuração do Mitogen para o Ansible é muito simples:
Instalamos a biblioteca Mitogen:

pip install mitogen

Agora existem duas maneiras equivalentes — ou configurar as opções no arquivo de configuração ansible.cfg, ou 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

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 Mitogen 0.2.7 não funciona com Ansible 2.8 (em maio de 2019)

Vamos fazer 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 vamos tentar executar o playbook que cria arquivos na máquina remota:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Criar arquivos com o módulo copy
      copy:
        content: |
          arquivo de teste {{ item }}
        dest: ~\/file_{{ item }}
      with_sequence: start=1 end={{ n }}

E vamos executar com Mitogen e sem ele 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

Observamos uma melhoria de 2 vezes. Vamos verificar para 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

No final, aceleramos a execução em mais de 10 vezes!
Agora vamos tentar diferentes cenários e ver como nosso desempenho melhorou:

  • Cenário de cópia de arquivos para um host remoto a partir local (com módulo copy):
    Acelerando o Ansible com Mitogen

  • Cenário de criação de arquivos em um host remoto com copy módulo:
    Acelerando o Ansible com Mitogen

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

Vamos tentar um cenário com várias (3) máquinas remotas, por exemplo, um cenário de cópia de arquivos para um host remoto:
Acelerando o Ansible com Mitogen

Como podemos ver, Mitogen economiza tanto tempo quanto tráfego nesses cenários. Mas se o 'gargalo' não estiver no Ansible, mas por exemplo no I\/O do disco ou na rede, ou em qualquer outro lugar, então é difícil esperar que o Mitogen nos ajude.

Vamos tentar um cenário com a instalação de pacotes com yum\/dnf e módulos Python usando pip. Os pacotes foram armazenados em cache para não depender de falhas na rede:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Instalar pacotes
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Instalar módulos pip
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Com Mitogen, isso levou 12 segundos, assim como sem ele.
Na página Página Mitogen para Ansible Você pode ver outros benchmarks e testes. Como afirmado na página:

O Mitogen não pode acelerar o módulo durante sua execução. Ele pode apenas tornar a execução deste módulo o mais rápida possível.

Portanto, é importante identificar seus pontos críticos na implantação e, se eles forem causados pelo Ansible, o Mitogen pode ajudá-lo a resolvê-los e acelerar significativamente a execução de seus playbooks.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster