Ansible fonctionne via des connexions SSH vers des hôtes distants. Il ouvre une session SSH, se connecte, copie le code Python sur le réseau et l'écrit dans un fichier temporaire distinct. Après cela, il exécute ce fichier sur la machine distante. Toute cette séquence d'opérations est assez longue et fastidieuse, il existe donc différentes manières de l'optimiser.
L'une de ces façons est requiretty
paramètre pour sudo dans votre /etc/sudoers
fichier sur la machine distante)
Une nouvelle façon d'overclocker Ansible est une bibliothèque Python appelée
Mitogen, dans certaines circonstances, peut accélérer votre code Ansible plusieurs fois et réduire considérablement la consommation de trafic. Jetons un coup d'œil aux cas d'utilisation les plus populaires et voyons à quel point cela nous aide.
J'utilise principalement Ansible pour : créer des fichiers de configuration sur une machine distante, installer des packages, copier des fichiers vers et depuis la machine distante. Peut-être avez-vous d'autres exemples - écrivez dans les commentaires.
Allons-y!
La configuration de Mitogen pour Ansible est très simple :
Installez la bibliothèque Mitogen :
pip install mitogen
Il existe désormais deux manières équivalentes : soit configurer les options dans le fichier de configuration ansible.cfg, soit définir les variables d'environnement nécessaires.
Supposons que le chemin vers le Mitogen installé sera /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. Alors:
export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear
ou
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
Installons Ansible dans virtualenv, avec et sans 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
Veuillez noter que Mitogen 0.2.7 ne fonctionne pas avec Ansible 2.8 (à partir de mai 2019)
Créer des alias :
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'
Essayons maintenant d'exécuter un playbook qui crée des fichiers sur une machine distante :
---
- 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 }}
Et exécutons-le avec et sans Mitogen pour créer 10 fichiers :
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
Nous constatons une multiplication par 2. Vérifions 20, 30, ..., 100 fichiers :
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
En conséquence, nous avons accéléré l’exécution de plus de 10 fois !
Essayons maintenant différents scénarios et voyons à quel point tout fonctionne plus rapidement pour nous :
-
Script pour copier des fichiers vers un hôte distant depuis un hôte local (avec le module
copy
):
-
Script pour créer des fichiers sur un hôte distant avec
copy
module:
-
Scénario de téléchargement de fichiers d'un hôte distant vers un hôte local :
Essayons un scénario avec plusieurs (3) machines distantes, par exemple un scénario avec copie de fichiers sur un hôte distant :
Comme vous pouvez le constater, Mitogen nous fait gagner du temps et du trafic dans ces scénarios. Mais si le goulot d'étranglement ne se situe pas dans Ansible, mais par exemple dans les E/S d'un disque ou d'un réseau, ou ailleurs, alors il est difficile d'espérer que Mitogen nous aidera.
Essayons un script avec l'installation de packages avec les modules yum/dnf et python à l'aide de pip. Les packages ont été mis en cache afin de ne pas dépendre des problèmes de réseau :
---
- 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
Avec Mitogen, cela a pris 12 secondes, comme sans.
Sur la page
Mitogen ne peut pas accélérer le module lorsqu'il est en cours d'exécution. Cela ne peut que rendre l’exécution de ce module aussi rapide que possible.
Par conséquent, il est important de trouver vos goulots d'étranglement dans votre déploiement et s'ils sont dus à Ansible, alors Mitogen vous aidera à les résoudre et à accélérer considérablement l'exécution de vos playbooks.
Source: habr.com