Acceleració d'Ansible amb Mitogen

Ansible es va convertir en un dels més populars Gestió de la configuració del sistema. Després va ser comprat per Red Hat el 2015 la xifra participants del projecte va superar els milers i Ansible es va convertir probablement en el sistema de desplegament i orquestració més utilitzat. La seva àmplia gamma d'aplicacions és molt impressionant.

Ansible funciona mitjançant connexions SSH a amfitrions remots. Obre una sessió SSH, inicia sessió, copia el codi de Python a la xarxa i l'escriu en un fitxer temporal separat. Després d'això, executa aquest fitxer a la màquina remota. Tota aquesta seqüència d'operacions és força llarga i tediosa, per la qual cosa hi ha diverses maneres d'optimitzar-la.

Una d'aquestes maneres és Conduccions SSH que us permet utilitzar una sessió SSH per executar instruccions, en lloc d'obrir una sessió nova cada vegada, cosa que ens pot estalviar molt de temps. (Només recordeu apagar requiretty configuració de sudo al vostre /etc/sudoers fitxer a la màquina remota)

Una nova manera d'overclockejar Ansible és una biblioteca Python anomenada Mitogen. Si algú no n'ha sentit a parlar, us explicaré breument la seva funcionalitat. Permet una execució ràpida de codi Python en una màquina remota, i Ansible és només un exemple d'ús. Mitogen utilitza una canonada UNIX a la màquina remota i transfereix codi Python comprimit amb zlib i serialitzat amb pickle. Això ajuda a completar-lo més ràpidament i estalvia trànsit. Si esteu interessats en una explicació més detallada, el millor és llegir-la a la pàgina "Com funciona". Però avui ens centrarem només en com funciona la biblioteca amb Ansible.

Mitogen en determinades circumstàncies pot accelerar el vostre codi Ansible diverses vegades i reduir significativament el consum de trànsit. Mirem els casos d'ús més populars i veiem fins a quin punt ens ajuda.

Utilitzo Ansible més per: crear fitxers de configuració en una màquina remota, instal·lar paquets, copiar fitxers cap a i des de la màquina remota. Potser teniu altres exemples: escriviu als comentaris.

Anem!

La configuració de Mitogen per a Ansible és molt senzilla:
Instal·leu la biblioteca Mitogen:

pip install mitogen

Ara hi ha dues maneres equivalents: configurar les opcions del fitxer de configuració ansible.cfg o establir les variables d'entorn necessàries.

Suposem que el camí cap al Mitogen instal·lat serà /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Llavors:

export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear

o

[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy

Instal·lem Ansible a virtualenv, amb i sense 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

Tingueu en compte que Mitogen 0.2.7 no funciona amb Ansible 2.8 (a partir del maig de 2019)

Creació d'àlies:

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'

Ara intentem executar un llibre de jocs que creï fitxers en una 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 }}

I executem-lo amb i sense Mitogen per crear 10 fitxers:

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

Veiem una millora doble. Comprovem si hi ha 2, 20, ..., 30 fitxers:

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

Com a resultat, hem accelerat l'execució més de 10 vegades!
Ara provem diferents escenaris i veiem com més ràpid ens funciona tot:

  • Script per copiar fitxers a un host remot des d'un de local (amb el mòdul copy):
    Acceleració d'Ansible amb Mitogen

  • Script per crear fitxers en un host remot amb copy mòdul:
    Acceleració d'Ansible amb Mitogen

  • Escenari amb la descàrrega de fitxers d'un amfitrió remot a un de local:
    Acceleració d'Ansible amb Mitogen

Provem un escenari amb diverses (3) màquines remotes, per exemple, un escenari amb la còpia de fitxers a un host remot:
Acceleració d'Ansible amb Mitogen

Com podeu veure, Mitogen ens estalvia temps i trànsit en aquests escenaris. Però si el coll d'ampolla no es troba a Ansible, sinó, per exemple, a l'E/S d'un disc o xarxa, o en un altre lloc, és difícil esperar que Mitogen ens ajudi.

Provem un script amb la instal·lació de paquets amb mòduls yum/dnf i python amb pip. Els paquets es van guardar a la memòria cau per no dependre dels errors de la xarxa:

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

Amb Mitogen va trigar 12 segons, el mateix que sense.
A la pàgina Pàgina Mitogen per a Ansible podeu mirar altres punts de referència i proves. Com diu la pàgina:

Mitogen no pot accelerar el mòdul quan s'està executant. Només pot fer que l'execució d'aquest mòdul sigui el més ràpida possible.

Per tant, és important trobar els vostres colls d'ampolla en el vostre desplegament i, si es deuen a Ansible, Mitogen us ajudarà a resoldre'ls i accelerarà significativament l'execució dels vostres llibres de joc.

Font: www.habr.com

Afegeix comentari