Ansible fungerer over SSH-forbindelser til fjernværter. Den åbner en SSH-session, logger på, kopierer Python-koden over netværket og skriver den til en separat midlertidig fil. Derefter kører den denne fil på den eksterne maskine. Hele denne sekvens af operationer er ret lang og kedelig, så der er forskellige måder at optimere den på.
En af disse måder er requiretty
indstilling for sudo i din /etc/sudoers
fil på den eksterne maskine)
En ny måde at overclocke Ansible på er et python-bibliotek kaldet
Mitogen kan under visse omstændigheder fremskynde din Ansible-kode flere gange og reducere trafikforbruget betydeligt. Lad os se de mest populære use cases og se, hvor meget det hjælper os.
Jeg bruger Ansible mest til: oprettelse af konfigurationsfiler på en fjernmaskine, installation af pakker, kopiering af filer til og fra fjernmaskinen. Måske har du andre eksempler - skriv i kommentarerne.
Lad os gå!
Mitogen-konfigurationen til Ansible er meget enkel:
Installer Mitogen-biblioteket:
pip install mitogen
Nu er der to ækvivalente måder - enten konfigurer indstillingerne i ansible.cfg konfigurationsfilen, eller indstil de nødvendige miljøvariabler.
Lad os antage, at stien til den installerede Mitogen vil være /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. Derefter:
export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear
eller
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
Lad os installere Ansible i virtualenv, med og uden 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
Bemærk venligst, at Mitogen 0.2.7 ikke virker med Ansible 2.8 (fra maj 2019)
Oprettelse af 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'
Lad os nu prøve at køre en afspilningsbog, der opretter filer på en fjernmaskine:
---
- 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 lad os køre det med og uden Mitogen for at oprette 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.643s
Vi ser en 2-fold forbedring. Lad os se efter 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.197s
Som et resultat fremskyndede vi eksekveringen med mere end 10 gange!
Lad os nu prøve forskellige scenarier og se, hvor meget hurtigere alt fungerer for os:
-
Script til kopiering af filer til en ekstern vært fra en lokal (med modulet
copy
):
-
Script til at oprette filer på en fjernvært med
copy
modul:
-
Scenarie med download af filer fra en ekstern vært til en lokal:
Lad os prøve et scenarie med flere (3) fjernmaskiner, for eksempel et scenarie med kopiering af filer til en fjernvært:
Som du kan se, sparer Mitogen os både tid og trafik i disse scenarier. Men hvis flaskehalsen ikke er i Ansible, men for eksempel i I/O på en disk eller et netværk, eller et andet sted, så er det svært at forvente, at Mitogen vil hjælpe os.
Lad os prøve et script med at installere pakker med yum/dnf og python-moduler ved hjælp af pip. Pakkerne blev cachelagret for ikke at afhænge af netværksfejl:
---
- 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 tog det 12 sekunder, det samme som uden.
På siden
Mitogen kan ikke fremskynde modulet, når det kører. Det kan kun gøre udførelsen af dette modul så hurtig som muligt.
Derfor er det vigtigt at finde dine flaskehalse i din udrulning og hvis de skyldes Ansible, så vil Mitogen hjælpe dig med at løse dem og fremskynde eksekveringen af dine playbooks markant.
Kilde: www.habr.com