Ansible werkt via SSH-verbindingen met externe hosts. Het opent een SSH-sessie, logt in, kopieert de Python-code over het netwerk en schrijft deze naar een apart tijdelijk bestand. Daarna wordt dit bestand op de externe machine uitgevoerd. Deze hele reeks bewerkingen is behoorlijk lang en vervelend, dus er zijn verschillende manieren om deze te optimaliseren.
Eén van deze manieren is requiretty
instelling voor sudo in je /etc/sudoers
bestand op de externe machine)
Een nieuwe manier om Ansible te overklokken is een Python-bibliotheek genaamd
Mitogen kan onder bepaalde omstandigheden uw Ansible-code meerdere keren versnellen en het verkeersverbruik aanzienlijk verminderen. Laten we eens kijken naar de meest populaire gebruiksscenario's en kijken hoeveel het ons helpt.
Ik gebruik Ansible het meest voor: het maken van configuratiebestanden op een externe machine, het installeren van pakketten, het kopiëren van bestanden van en naar de externe machine. Misschien heb je andere voorbeelden - schrijf in de reacties.
Laten we gaan!
Mitogen-configuratie voor Ansible is heel eenvoudig:
Installeer de Mitogen-bibliotheek:
pip install mitogen
Nu zijn er twee gelijkwaardige manieren: configureer de opties in het configuratiebestand ansible.cfg of stel de benodigde omgevingsvariabelen in.
Laten we aannemen dat het pad naar de geïnstalleerde Mitogen er zal zijn /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. Dan:
export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear
of
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
Laten we Ansible in virtualenv installeren, met en zonder 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
Houd er rekening mee dat Mitogen 0.2.7 niet werkt met Ansible 2.8 (vanaf mei 2019)
Aliassen maken:
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'
Laten we nu proberen een draaiboek uit te voeren dat bestanden op een externe machine maakt:
---
- 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 }}
En laten we het met en zonder Mitogen uitvoeren om 10 bestanden te maken:
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
We zien een tweevoudige verbetering. Laten we 2, 20, ..., 30 bestanden controleren:
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
Als gevolg hiervan hebben we de uitvoering met meer dan 10 keer versneld!
Laten we nu verschillende scenario's proberen en zien hoeveel sneller alles voor ons werkt:
-
Script voor het kopiëren van bestanden naar een externe host vanaf een lokale host (met de module
copy
):
-
Script voor het maken van bestanden op een externe host met
copy
module:
-
Scenario met het downloaden van bestanden van een externe host naar een lokale host:
Laten we een scenario proberen met meerdere (3) externe machines, bijvoorbeeld een scenario met het kopiëren van bestanden naar een externe host:
Zoals u kunt zien, bespaart Mitogen ons in deze scenario's zowel tijd als verkeer. Maar als het knelpunt niet in Ansible zit, maar bijvoorbeeld in de I/O van een schijf of netwerk, of ergens anders, dan is het moeilijk te verwachten dat Mitogen ons zal helpen.
Laten we een script proberen met het installeren van pakketten met yum/dnf- en python-modules met behulp van pip. De pakketten zijn in de cache opgeslagen om niet afhankelijk te zijn van netwerkstoringen:
---
- 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
Met Mitogen duurde het 12 seconden, hetzelfde als zonder.
Op de pagina
Mitogen kan de module niet versnellen wanneer deze actief is. Het kan de uitvoering van deze module alleen zo snel mogelijk maken.
Daarom is het belangrijk om uw knelpunten in uw implementatie te vinden en als deze te wijten zijn aan Ansible, dan zal Mitogen u helpen deze op te lossen en de uitvoering van uw draaiboeken aanzienlijk te versnellen.
Bron: www.habr.com