Ansible fungerer over SSH-tilkoblinger til eksterne verter. Den åpner en SSH-sesjon, logger på, kopierer Python-koden over nettverket og skriver den til en egen midlertidig fil. Etter det kjører den denne filen på den eksterne maskinen. Hele denne operasjonssekvensen er ganske lang og kjedelig, så det er forskjellige måter å optimalisere den på.
En av disse måtene er requiretty
innstilling for sudo i din /etc/sudoers
fil på den eksterne maskinen)
En ny måte å overklokke Ansible på er et python-bibliotek som heter
Mitogen kan under visse omstendigheter øke hastigheten på Ansible-koden flere ganger og redusere trafikkforbruket betydelig. La oss sjekke ut de mest populære brukstilfellene og se hvor mye det hjelper oss.
Jeg bruker Ansible mest for: å lage konfigurasjonsfiler på en ekstern maskin, installere pakker, kopiere filer til og fra den eksterne maskinen. Kanskje du har andre eksempler - skriv i kommentarfeltet.
La oss gå!
Mitogen-konfigurasjonen for Ansible er veldig enkel:
Installer Mitogen-biblioteket:
pip install mitogen
Nå er det to tilsvarende måter - enten konfigurer alternativene i konfigurasjonsfilen ansible.cfg, eller angi de nødvendige miljøvariablene.
La oss anta at banen til den installerte Mitogen vil være /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. Deretter:
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
La 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.10
Vær oppmerksom på at Mitogen 0.2.7 ikke fungerer med Ansible 2.8 (per mai 2019)
Lage 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'
La oss nå prøve å kjøre en spillebok 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 la oss kjøre den med og uten Mitogen 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.643s
Vi ser en dobbel forbedring. La oss se etter 2, 20, ..., 30 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 akselererte vi utførelsen med mer enn 10 ganger!
La oss nå prøve forskjellige scenarier og se hvor mye raskere alt fungerer for oss:
-
Skript for å kopiere filer til en ekstern vert fra en lokal (med modulen
copy
):
-
Skript for å lage filer på en ekstern vert med
copy
modul:
-
Scenario med nedlasting av filer fra en ekstern vert til en lokal:
La oss prøve et scenario med flere (3) eksterne maskiner, for eksempel et scenario med kopiering av filer til en ekstern vert:
Som du ser sparer Mitogen oss for både tid og trafikk i disse scenariene. Men hvis flaskehalsen ikke er i Ansible, men for eksempel i I/O på en disk eller et nettverk, eller et annet sted, så er det vanskelig å forvente at Mitogen vil hjelpe oss.
La oss prøve et skript med å installere pakker med yum/dnf og python-moduler ved å bruke pip. Pakkene ble bufret for ikke å være avhengig av nettverksfeil:
---
- 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 det 12 sekunder, det samme som uten.
Side
Mitogen kan ikke øke hastigheten på modulen når den kjører. Det kan bare gjøre utførelsen av denne modulen så rask som mulig.
Derfor er det viktig å finne flaskehalsene dine i distribusjonen din, og hvis de skyldes Ansible, vil Mitogen hjelpe deg med å løse dem og øke hastigheten på utførelsen av spillebøkene betydelig.
Kilde: www.habr.com