Pospešujemo Ansible s pomočjo Mitogen

Ansible je postal eden najbolj priljubljenih sistemov za upravljanje konfiguracije. Potem ko je bil kupljen s strani Red Hata se je leta 2015 število udeležencev projekta preseglo tisoč, Ansible je verjetno postal najbolj uporabljan sistem za nameščanje in orkestracijo. Njegove široke možnosti uporabe so zelo impresivne.

Ansible deluje preko SSH povezav do oddaljenih gostiteljev. Odpre SSH sejo, se prijavi, kopira kodo v Pythonu po omrežju in jo zapiše v ločeno začasno datoteko. Nato to datoteko zažene na oddaljenem stroju. Celoten postopek je precej dolg in zamuden, zato obstajajo različni načini, kako ga optimizirati.

Eden od teh načinov so SSH pipelines , ki omogočajo uporabo ene SSH seje za izvajanje ukazov, namesto da bi vsakič odprli novo sejo, kar nam lahko prihrani veliko časa. (Samo ne pozabite onemogočiti requiretty nastavitev za sudo v vašem /etc/sudoers fajlu na oddaljenem stroju)

Nov način za 'pospešitev' Ansible je Python knjižnica po imenu Mitogen. Če je nekdo še ni slišal - na kratko bom opisal njene funkcionalnosti. Omogoča hitro izvajanje kode Python na oddaljenem stroju, Ansible pa je le en od primerov uporabe. Mitogen uporablja UNIX cev na oddaljenem stroju in prenaša kodirano Python kodo, stisnjeno z zlib in serializirano s pomočjo pickle. To pripomore k hitrejšemu izvrševanju in prihranku prometa. Če vas zanima podrobnejše razlago, je najbolje, da preberete na strani Kako deluje. Danes pa se bomo osredotočili le na delo knjižnice z Ansible.

Mitogen lahko v določenih okoliščinah pospeši vašo Ansible kodo večkrat in znatno zmanjša porabo prometa. Oglejmo si najpogostejše primere uporabe in preverimo, koliko nam to pomaga.

Največkrat uporabljam Ansible za: ustvarjanje konfiguracijskih datotek na oddaljenem stroju, namestitev paketov, kopiranje datotek na oddaljeni stroj in nazaj. Morda imate druge primere - pišite v komentarjih.

Gremo!

Konfiguracija Mitogen za Ansible je zelo preprosta:
Namestimo Mitogen knjižnico:

pip install mitogen

Sedaj imamo dva enakovredna načina - ali nastavite možnosti v konfiguracijski datoteki ansible.cfg, ali nastavite potrebne okoljske spremenljivke.

Predpostavimo, da je pot do nameščenega Mitogena /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Takole:

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

ili

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

Namestimo Ansible v virtualenv, z Mitogen in brez nje:

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

Upoštevajte, da Mitogen 0.2.7 ne deluje z Ansible 2.8 (do maja 2019)

Ustvarimo aliasa:

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'

Zdaj poskusimo zagnati playbook, ki ustvari datoteke na oddanem stroju:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Ustvari datoteke z modulom copy
      copy:
        content: |
          testna datoteka {{ item }}
        dest: ~/file_{{ item }}
      with_sequence: start=1 end={{ n }}

In zagnali bomo z Mitogen in brez njega za ustvarjanje 10 datotek:

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

Vidimo izboljšanje za 2-krat. Preverimo za 20, 30, ..., 100 datotek:

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

Na koncu smo pospešili izvajanje več kot 10-krat!
Zdaj poskusimo različne scenarije in poglejmo, kako hitro deluje:

  • Scenarij kopiranja datotek na oddan gostiteljski stroj z lokalnega (z modulom copy):
    Pospešujemo Ansible s pomočjo Mitogen

  • Scenarij ustvarjanja datotek na oddanem gostitelju z copy modulom:
    Pospešujemo Ansible s pomočjo Mitogen

  • Scenarij z nalaganjem datotek s oddanega gostitelja na lokalnega:
    Pospešujemo Ansible s pomočjo Mitogen

Poskusimo scenarij z več (3) oddanimi stroji, na primer scenarij s kopiranjem datotek na oddan gostiteljski stroj:
Pospešujemo Ansible s pomočjo Mitogen

Kot je razvidno, Mitogen prihrani tako čas kot promet v teh scenarijih. Vendar, če je 'ozko grlo' v Ansible, na primer v I/O diska ali omrežja, ali kjer koli drugje, potem težko pričakujemo, da nam bo Mitogen pomagal.

Poskusimo scenarij z namestitvijo paketov z yum/dnf in modulov python s pomočjo pip. Paketi so bili predpomnjeni, da ne bi bili odvisni od težav v omrežju:

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

    - name: Namesti pip module
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

S Mitogen je to trajalo 12 sekund, kot brez njega.
Na strani Mitogen za Ansible stran lahko si ogledate druge merilne teste in primerjave. Kot je navedeno na strani:

Mitogen ne more pospešiti modula, ko se izvaja. Lahko le pospeši izvajanje tega modula do maksimuma.

Zato je pomembno, da najdete tesna mesta pri implementaciji, in če so ta povezana z Ansible, vam bo Mitogen pomagal, da jih odpravite in močno pospešite izvajanje vaših playbookov.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster