Ubrzavanje Ansiblea s Mitogenom

Ansible postao jedan od najpopularnijih Upravljanje konfiguracijom sustava. Nakon je kupio Red Hat u 2015. broj sudionici projekta premašio tisuće i Ansible je postao vjerojatno najkorišteniji sustav za implementaciju i orkestraciju. Njegov širok raspon primjena je vrlo impresivan.

Ansible radi preko SSH veza s udaljenim hostovima. Otvara SSH sesiju, prijavljuje se, kopira Python kod preko mreže i zapisuje ga u zasebnu privremenu datoteku. Nakon toga pokreće ovu datoteku na udaljenom računalu. Cijeli ovaj slijed operacija je prilično dug i zamoran, pa postoje različiti načini kako ga optimizirati.

Jedan od tih načina je SSH cjevovoda koji vam omogućuje korištenje jedne SSH sesije za izvršavanje instrukcija, umjesto otvaranja nove sesije svaki put, što nam može uštedjeti puno vremena. (Samo ne zaboravite isključiti requiretty postavka za sudo u vašem /etc/sudoers datoteka na udaljenom računalu)

Novi način za overclockiranje Ansiblea je python biblioteka pod nazivom Mitogen. Ako netko nije čuo za njega, ukratko ću opisati njegovu funkcionalnost. Omogućuje brzo izvršavanje python koda na udaljenom računalu, a Ansible je samo jedan od primjera korištenja. Mitogen koristi UNIX cijevi na udaljenom stroju i prenosi python kod komprimiran sa zlib i serijaliziran sa pickle. To pomaže bržem dovršavanju i štedi promet. Ako vas zanima detaljnije objašnjenje, najbolje je da o tome pročitate na stranici "Kako radi". Ali danas ćemo se fokusirati samo na to kako knjižnica radi s Ansibleom.

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

Ansible najviše koristim za: stvaranje konfiguracijskih datoteka na udaljenom računalu, instaliranje paketa, kopiranje datoteka na i s udaljenog računala. Možda imate druge primjere - napišite u komentarima.

Idemo!

Mitogen konfiguracija za Ansible je vrlo jednostavna:
Instalirajte biblioteku Mitogen:

pip install mitogen

Sada postoje dva ekvivalentna načina - ili konfigurirajte opcije u konfiguracijskoj datoteci ansible.cfg ili postavite potrebne varijable okoline.

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

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, sa i bez Mitogena:

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

Imajte na umu da Mitogen 0.2.7 ne radi s Ansible 2.8 (od svibnja 2019.)

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

Pokušajmo sada pokrenuti playbook koji stvara datoteke na udaljenom računalu:

---
- 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 pokrenimo ga sa i bez Mitogena da stvorimo 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 dvostruki napredak. Provjerimo 2, 20, ..., 30 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

Kao rezultat toga, ubrzali smo izvršenje za više od 10 puta!
Isprobajmo sada različite scenarije i vidimo koliko brže sve radi za nas:

  • Skripta za kopiranje datoteka na udaljeni host s lokalnog (s modulom copy):
    Ubrzavanje Ansiblea s Mitogenom

  • Skripta za stvaranje datoteka na udaljenom računalu s copy modul:
    Ubrzavanje Ansiblea s Mitogenom

  • Scenarij s preuzimanjem datoteka s udaljenog hosta na lokalni:
    Ubrzavanje Ansiblea s Mitogenom

Pokušajmo scenarij s nekoliko (3) udaljenih računala, na primjer scenarij s kopiranjem datoteka na udaljeni host:
Ubrzavanje Ansiblea s Mitogenom

Kao što vidite, Mitogen nam štedi i vrijeme i promet u ovim scenarijima. Ali ako usko grlo nije u Ansibleu, nego primjerice u I/O diska ili mreže, ili negdje drugdje, onda je teško očekivati ​​da će nam Mitogen pomoći.

Pokušajmo sa skriptom koja instalira pakete s modulima yum/dnf i python koristeći pip. Paketi su spremljeni u predmemoriju kako ne bi ovisili o mrežnim greškama:

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

S Mitogenom je trajalo 12 sekundi, isto kao i bez njega.
Na stranici Stranica Mitogen za Ansible možete pogledati druge benchmarkove i testove. Kao što stranica navodi:

Mitogen ne može ubrzati modul dok radi. Može samo učiniti izvršenje ovog modula što je brže moguće.

Stoga je važno pronaći uska grla u svojoj implementaciji, a ako su uzrokovana Ansibleom, tada će vam Mitogen pomoći da ih riješite i značajno ubrzati izvođenje vaših priručnika.

Izvor: www.habr.com

Dodajte komentar