ble en av de mest populære . Etter at i 2015 nådde antallet overskred tusen, og Ansible har blitt kanskje det mest brukte systemet for distribusjon og orkestrering. Dets brede bruksområder er veldig imponerende.
Ansible fungerer via SSH-tilkoblinger til eksterne vertsmaskiner. Den åpner en SSH-økt, logger inn, kopierer Python-kode over nettet, og lagrer den i en separat midlertidig fil. Deretter kjører den denne filen på den eksterne maskinen. Hele denne sekvensen av operasjoner er ganske langvarig og kjedelig, så det finnes forskjellige måter å optimalisere den på.
En av disse måtene er som lar oss bruke én SSH-økt for å utføre instruksjoner i stedet for å åpne en ny økt hver gang, noe som kan spare oss for mye tid. (Bare ikke glem å slå av requiretty innstillingen for sudo i din /etc/sudoers fil på den eksterne maskinen)
En ny måte å «frekvensheve» Ansible på er en Python-bibliotek som heter . Hvis noen ikke har hørt om det – så skal jeg kort beskrive funksjonaliteten. Den muliggjør rask kjøring av Python-kode på eksterne maskiner, og Ansible er bare ett av bruksområdene. Mitogen bruker UNIX-pipe på den eksterne maskinen og sender Python-kode komprimert med zlib og serialisert ved hjelp av pickle. Dette bidrar til å kjøre det raskere og sparer båndbredde. Hvis du er interessert i en mer detaljert forklaring, er det best å lese om dette på siden . Men i dag skal vi fokusere bare på bibliotekets arbeid med Ansible.
Mitogen kan i visse omstendigheter akselerere Ansible-koden din flere ganger og betydelig redusere båndbreddebruken. La oss sjekke de mest populære bruksområdene og se hvor mye det hjelper oss.
Jeg bruker mest Ansible til: å opprette konfigurasjonsfiler på den eksterne maskinen, installere pakker, kopiere filer til den eksterne maskinen og tilbake. Kanskje har du andre eksempler – skriv dem i kommentarene.
La oss gå!
Konfigurasjonen av Mitogen for Ansible er veldig enkel:
Installer Mitogen-biblioteket:
pip install mitogenNå er det to like måter – enten å konfigurere alternativene i konfigurasjonsfilen ansible.cfg, eller å sette de nødvendige miljøvariablene.
La oss anta at stien til den installerte Mitogen vil være /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Da:
export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_lineareller
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategyLa oss installere Ansible i virtualenv, med og uten 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.10Merk at Mitogen 0.2.7 ikke fungerer med Ansible 2.8 (per mai 2019)
Vi lager aliaser:
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'Nå skal vi prøve å kjøre et playbook som lager filer på en ekstern maskin:
---
- 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 }}Og vi kjører med Mitogen og uten for å lage 10 filer:
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.643sVi ser en forbedring på 2 ganger. La oss sjekke for 20, 30, …, 100 filer:
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.197sSom et resultat har vi akselerert utførelsen med mer enn 10 ganger!
Nå skal vi prøve forskjellige scenarier og se hvor mye raskere alt fungerer:
Scenario for å kopiere filer til en ekstern vert fra lokal (med modulen
copy):
Scenario for å opprette filer på en ekstern vert med
copymodulen:
Scenario for å laste ned filer fra en ekstern vert til lokal:
Vi prøver et scenario med flere (3) eksterne maskiner, for eksempel scenariet med å kopiere filer til en ekstern vert:
Som vi kan se, sparer Mitogen både tid og båndbredde i disse scenariene. Men hvis «flaskehalsen» ikke er i Ansible, men for eksempel i disk I/O eller nettverket, eller et annet sted, er det vanskelig å forvente at Mitogen vil hjelpe oss.
La oss prøve et scenario med å installere pakker med yum/dnf og Python-moduler med pip. Pakker ble hurtigbufferlagret for ikke å være avhengig av nettverksproblemer:
---
- 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
Med Mitogen tok dette 12 sekunder, akkurat som uten det.
På siden Du kan se andre benchmarker og tester. Som det angis på siden:
Mitogen kan ikke akselerere en modul når den blir kjørt. Den kan bare gjøre kjøringen av denne modulen så rask som mulig.
Derfor er det viktig å finne dine flaskehalser i distribusjonen, og hvis de skyldes Ansible, vil Mitogen hjelpe deg med å løse dem og betydelig akselerere utførelsen av playbookene dine.
Kilde: habr.com
