Accelerează Ansible cu ajutorul Mitogen

Ansible a devenit una dintre cele mai populare sisteme de management al configurației. După ce a fost achiziționat de Red Hat în 2015, numărul participanților la proiect a depășit mii, iar Ansible a devenit probabil cel mai utilizat sistem de desfășurare și orchestration. Domeniile sale de aplicare sunt foarte impresionante.

Ansible funcționează prin conexiuni SSH la gazdele remote. Deschide o sesiune SSH, se conectează, copiază cod Python prin rețea și îl înregistrează într-un fișier temporar separat. Apoi rulează acest fișier pe mașina remote. Întreaga secvență de operațiuni este destul de lungă și plictisitoare, de aceea există diverse modalități de a o optimiza.

Una dintre aceste modalități este SSH pipelines care permit utilizarea unei singure sesiuni SSH pentru executarea instrucțiunilor, fără a deschide de fiecare dată o nouă sesiune, ceea ce ne poate economisi mult timp. (Doar nu uitați să dezactivați requiretty din configurația sudo în fișierul vostru de pe mașina remote) /etc/sudoers O nouă modalitate de a „îmbunătăți” Ansible este biblioteca Python numită

Mitogen . Dacă cineva nu a auzit de ea – voi descrie pe scurt funcționalitatea sa. Ea permite execuția rapidă a codului Python pe mașina remote, iar Ansible este doar un exemplu de utilizare. Mitogen folosește pipe UNIX pe mașina remote și transmite codul Python comprimat cu zlib și serializat cu pickle. Acest lucru ajută la executarea mai rapidă și economisește trafic. Dacă sunteți interesați de o explicație mai detaliată, cel mai bine ar fi să citiți despre aceasta pe pagina„Cum funcționează” . Dar astăzi ne vom concentra doar pe utilizarea bibliotecii cu Ansible.Mitogen, în anumite condiții, poate accelera codul vostru Ansible de câteva ori și poate reduce semnificativ consumul de trafic. Să verificăm cele mai populare exemple de utilizare și să vedem cât de mult ne ajută.

Cel mai mult folosesc Ansible pentru: crearea fișierelor de configurație pe mașina remote, instalarea pachetelor, copierea fișierelor pe mașina remote și înapoi. Poate aveți și alte exemple – scrieți în comentarii.

Să începem!

Configurarea Mitogen pentru Ansible este foarte simplă:

Instalăm biblioteca Mitogen:
pip install mitogen

Acum există două moduri echivalente – fie să configurăm opțiunile în fișierul de configurare ansible.cfg, fie să setăm variabilele de mediu necesare.

Să presupunem că calea către Mitogen instalat va fi

Să presupunem că calea către Mitogen-ul instalat va fi /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Atunci:

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

sau

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

Vom instala Ansible în virtualenv, cu și fără 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

Rețineți că Mitogen 0.2.7 nu funcționează cu Ansible 2.8 (în mai 2019)

Facem aliasuri:

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'

Acum vom încerca să rulăm un playbook care creează fișiere pe o mașină remote:

---
- 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 vom rula cu Mitogen și fără el pentru a crea 10 fișiere:

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

Vedem o îmbunătățire de 2 ori. Să verificăm pentru 20, 30, …, 100 fișiere:

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

În concluzie, am accelerat execuția de mai mult de 10 ori!
Acum vom încerca diferite scenarii și vom vedea cât de mult se îmbunătățește totul:

  • Scenariul de copiere a fișierelor pe un host remote din cel local (cu modulul copy):
    Accelerează Ansible cu ajutorul Mitogen

  • Scenariul de creare a fișierelor pe un host remote cu copy modulul:
    Accelerează Ansible cu ajutorul Mitogen

  • Scenariul de descărcare a fișierelor de pe un host remote pe cel local:
    Accelerează Ansible cu ajutorul Mitogen

Vom încerca un scenariu cu mai multe (3) mașini remote, de exemplu, scenariul de copiere a fișierelor pe un host remote:
Accelerează Ansible cu ajutorul Mitogen

După cum se poate observa, Mitogen economisește atât timp, cât și trafic în aceste scenarii. Dar dacă "gâtul de sticlă" nu este în Ansible, ci, de exemplu, în I/O-ul discului sau în rețea, sau în altă parte, atunci este greu de așteptat ca Mitogen să ne ajute.

Să încercăm un scenariu cu instalarea pachetelor folosind yum/dnf și module python cu ajutorul pip. Pachetele au fost cache-uite pentru a nu depinde de problemele de rețea:

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

Cu Mitogen, a durat 12 secunde, la fel ca și fără el.
Pe pagina Mitogen for Ansible page Puteți vizualiza alte benchmark-uri și teste. Așa cum se afirmă pe pagină:

Mitogen nu poate accelera un modul atunci când acesta este în execuție. Poate doar să facă execuția acestui modul cât mai rapidă posibil.

Prin urmare, este important să identificați zonele necorespunzătoare în desfășurarea dumneavoastră, iar dacă acestea sunt cauzate de Ansible, Mitogen vă va ajuta să le rezolvați și să accelerați semnificativ execuția playbook-urilor dumneavoastră.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster