Ubrzanje Ansiblea uz Mitogen

Ansible postao je jedan od najpopularnijih sustava upravljanja konfiguracijom. Nakon što je kupljen od strane Red Hata 2015. godine broj sudionika projekta prešao je tisuće i Ansible je postao vjerojatno najkorišteniji sustav za implementaciju i orkestraciju. Njegova široka područja primjene su vrlo impresivna.

Ansible radi putem SSH veza s udaljenim hostovima. Otvara SSH sesiju, prijavljuje se, kopira Python kod putem mreže i zapisuje ga u privremenu datoteku. Nakon toga pokreće tu datoteku na udaljenoj mašini. Cijela ova sekvenca radnji je prilično spora i zamorna, zbog čega postoje različiti načini za optimizaciju.

Jedan od tih načina je SSH cjevovodi koji omogućuje korištenje jedne SSH sesije za izvršavanje instrukcija, umjesto da se svaki put otvara nova sesija, što može uštedjeti mnogo vremena. (Samo ne zaboravite isključiti requiretty određivanje za sudo u vašem /etc/sudoers datoteci na udaljenoj mašini)

Novi način „ubrzavanja“ Ansibla je Python biblioteka po imenu Mitogen. Ako netko o njoj nije čuo — ukratko ću opisati njenu funkcionalnost. Omogućuje brzo izvršavanje Python koda na udaljenoj mašini, a Ansible je samo jedan od primjera korištenja. Mitogen koristi UNIX cijev na udaljenoj mašini i prenosi Python kod komprimiran zlib i serijaliziran pomoću picklea. To pomaže u bržem izvršenju i štedi propusnost. Ako ste zainteresirani za detaljnije objašnjenje, najbolje je pročitati o tome na stranici „Kako to radi“. No, danas ćemo se fokusirati samo na rad biblioteke s Ansibleom.

Mitogen u određenim okolnostima može ubrzati vaš Ansible kod nekoliko puta i značajno smanjiti potrošnju prometa. Pogledajmo najpopularnije primjere korištenja i vidimo koliko nam to pomaže.

Najviše koristim Ansible za: izradu datoteka konfiguracije na udaljenoj mašini, instalaciju paketa, kopiranje datoteka na udaljenu mašinu i nazad. Možda imate druge primjere — napišite u komentarima.

Idemo!

Konfiguracija Mitogen za Ansible je vrlo jednostavna:
Instaliramo Mitogen biblioteku:

pip install mitogen

Sada postoje dva jednaka načina — ili postaviti opcije u konfiguracijskoj datoteci ansible.cfg, ili postaviti potrebne varijable okruženja.

Pretpostavimo da će put do instaliranog Mitogena biti /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Tada:

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

Instalirajmo Ansible u virtualenv, s Mitogen i bez njega:

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

Napomena: Mitogen 0.2.7 ne radi s Ansible 2.8 (od svibnja 2019)

Napravimo alias-e:

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'

Sada probajmo pokrenuti playbook koji stvara datoteke na udaljenoj mašini:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Stvori datoteke s modulom za kopiranje sadržaja
      copy:
        content: |
          testna datoteka {{ item }}
        dest: ~/datoteka_{{ item }}
      with_sequence: start=1 end={{ n }}

I pokrenut ćemo s Mitogen i bez njega kako bismo stvorili 10 datoteka:

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 poboljšanje od 2 puta. Provjerimo za 20, 30, …, 100 datoteka:

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 kraju, ubrzali smo izvođenje više od 10 puta!
Sada probajmo različite scenarije i vidimo koliko brže sve radi:

  • Scenarij kopiranja datoteka na udaljeni host s lokalnog (s modulom copy):
    Ubrzanje Ansiblea uz Mitogen

  • Scenarij stvaranja datoteka na udaljenom hostu s copy modulom:
    Ubrzanje Ansiblea uz Mitogen

  • Scenarij s preuzimanjem datoteka s udaljenog hosta na lokalni:
    Ubrzanje Ansiblea uz Mitogen

Probajmo scenarij s nekoliko (3) udaljenih mašina, na primjer, scenarij s kopiranjem datoteka na udaljeni host:
Ubrzanje Ansiblea uz Mitogen

Kao što vidimo, Mitogen nam štedi i vrijeme i promet u ovim scenarijima. No, ako je 'usko grlo' izvan Ansible-a, na primjer, u I/O diska ili mreži, ili negdje drugdje, teško je očekivati da će nam Mitogen pomoći.

Probajmo scenarij s instalacijom paketa s yum/dnf i modula python pomoću pipa. Paketi su bili keširani kako ne bismo ovisili o problemima u mreži:

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

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

S Mitogenom to je trajalo 12 sekundi, kao i bez njega.
korisnik postavlja ime novo stvorene mreže. Mitogen za Ansible stranica možete pogledati druge benchmarke i testove. Kao što se tvrdi na stranici:

Mitogen ne može ubrzati modul kada se izvršava. Može samo učiniti izvršavanje tog modula što bržim koliko god je to moguće.

Zato je važno pronaći svoje uska grla u implementaciji i ako su ona uzrokovana Ansibleom, Mitogen će vam pomoći da ih riješite i značajno ubrza izvršavanje vaših playbookova.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster