Akceli Ansible kun Mitogen

Respondema fariĝis unu el la plej popularaj Sistema Agorda Administrado. Post estis aĉetita fare de Red Hat en 2015 la nombro partoprenantoj de la projekto superis milojn kaj Ansible iĝis verŝajne la plej uzita deplojo kaj orkestradsistemo. Ĝia larĝa gamo de aplikoj estas tre impona.

Ansible funkcias per SSH-konektoj al foraj gastigantoj. Ĝi malfermas SSH-sesion, ensalutas, kopias la Python-kodon tra la reto kaj skribas ĝin al aparta provizora dosiero. Post tio, ĝi rulas ĉi tiun dosieron sur la fora maŝino. Ĉi tiu tuta sekvenco de operacioj estas sufiĉe longa kaj teda, do ekzistas diversaj manieroj optimumigi ĝin.

Unu el ĉi tiuj manieroj estas SSH-duktoj kiu permesas vin uzi unu SSH-sesion por ekzekuti instrukciojn, prefere ol malfermi novan sesion ĉiufoje, kio povas ŝpari al ni multan tempon. (Nur memoru malŝalti requiretty agordo por sudo en via /etc/sudoers dosiero sur la fora maŝino)

Nova maniero por overclock Ansible estas python-biblioteko nomita Mitogen. Se iu ne aŭdis pri ĝi, mi mallonge priskribos ĝian funkcion. Ĝi permesas rapidan ekzekuton de python-kodo sur fora maŝino, kaj Ansible estas nur unu ekzemplo de uzo. Mitogen uzas UNIX-pipon sur la fora maŝino kaj transdonas python-kodon kunpremitan per zlib kaj seriigitan per piklo. Ĉi tio helpas kompletigi ĝin pli rapide kaj ŝparas trafikon. Se vi interesiĝas pri pli detala klarigo, estas plej bone legi pri ĝi sur la paĝo "Kiel ĝi funkcias". Sed hodiaŭ ni koncentriĝos nur pri kiel la biblioteko funkcias kun Ansible.

Mitogen en certaj cirkonstancoj povas plirapidigi vian Ansible-kodon plurfoje kaj signife redukti trafikan konsumon. Ni rigardu la plej popularajn uzkazojn kaj vidu kiom ĝi helpas nin.

Mi uzas Ansible plej por: krei agordajn dosierojn sur fora maŝino, instali pakaĵojn, kopii dosierojn al kaj de la fora maŝino. Eble vi havas aliajn ekzemplojn - skribu en la komentoj.

Ni iru!

Mitogen-agordo por Ansible estas tre simpla:
Instalu la Mitogen-bibliotekon:

pip install mitogen

Nun ekzistas du ekvivalentaj manieroj - aŭ agordi la opciojn en la agorda dosiero ansible.cfg, aŭ agordi la necesajn mediovariablojn.

Ni supozu, ke la vojo al la instalita Mitogen estos /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Tiam:

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

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

Ni instalu Ansible en virtualenv, kun kaj sen 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

Bonvolu noti, ke Mitogen 0.2.7 ne funkcias kun Ansible 2.8 (de majo 2019)

Farante kaŝnomojn:

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'

Nun ni provu ruli ludlibron, kiu kreas dosierojn sur fora maŝino:

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

Kaj ni rulu ĝin kun kaj sen Mitogen por krei 10 dosierojn:

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

Ni vidas 2-oblan plibonigon. Ni kontrolu 20, 30, ..., 100 dosierojn:

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

Kiel rezulto, ni akcelis ekzekuton pli ol 10 fojojn!
Nun ni provu malsamajn scenarojn kaj vidu kiom pli rapide ĉio funkcias por ni:

  • Skripto por kopii dosierojn al fora gastiganto de loka (kun la modulo copy):
    Akceli Ansible kun Mitogen

  • Skripto por krei dosierojn sur fora gastiganto kun copy modulo:
    Akceli Ansible kun Mitogen

  • Scenaro kun elŝutado de dosieroj de fora gastiganto al loka:
    Akceli Ansible kun Mitogen

Ni provu scenaron kun pluraj (3) foraj maŝinoj, ekzemple scenaron kun kopiado de dosieroj al fora gastiganto:
Akceli Ansible kun Mitogen

Kiel vi povas vidi, Mitogen ŝparas al ni tempon kaj trafikon en ĉi tiuj scenaroj. Sed se la botelkolo ne estas en Ansible, sed ekzemple en la I/O de disko aŭ reto, aŭ ie aliloke, tiam estas malfacile atendi, ke Mitogen helpos nin.

Ni provu skripton kun instalado de pakaĵoj kun yum/dnf kaj python-moduloj uzante pip. La pakaĵoj estis kaŝmemorigitaj por ne dependi de retaj misfunkciadoj:

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

Kun Mitogen daŭris 12 sekundojn, same kiel sen ĝi.
Sur paĝo Mitogen por Ansible paĝo vi povas rigardi aliajn komparnormojn kaj testojn. Kiel la paĝo deklaras:

Mitogen ne povas akceli la modulon kiam ĝi funkcias. Ĝi nur povas fari la ekzekuton de ĉi tiu modulo kiel eble plej rapide.

Tial gravas trovi viajn proplempunktojn en via deplojo kaj se ili ŝuldiĝas al Ansible, tiam Mitogen helpos vin solvi ilin kaj signife akceli la ekzekuton de viaj ludlibroj.

fonto: www.habr.com

Aldoni komenton