Ansible est devenu l'un des systèmes de gestion de configuration les plus populaires. Après l'achat de Red Hat en 2015, le nombre de participants au projet a dépassé les milliers et Ansible était probablement le système de déploiement et d'orchestration le plus utilisé. Ses larges applications sont très impressionnantes.
Ansible fonctionne via des connexions SSH vers des hôtes distants. Il ouvre une session SSH, établit une connexion, copie le code Python sur le réseau et l'écrit dans un fichier temporaire séparé. 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 façons de l'optimiser.
L'une de ces méthodes est les pipelines SSH qui vous permettent d'utiliser une session SSH pour exécuter des instructions, plutôt que d'ouvrir une nouvelle session à chaque fois, ce qui peut nous faire gagner beaucoup de temps. (N'oubliez pas de désactiver le paramètre requiretty
pour sudo dans votre fichier /etc/sudoers
sur la machine distante)
Une nouvelle façon de "overclocker" Ansible est avec une bibliothèque python appelée Mitogen . si quelqu'un n'en a pas entendu parler, je décrirai brièvement sa fonctionnalité. Il permet une exécution rapide du code python sur une machine distante, et Ansible n'est qu'un cas d'utilisation. Mitogen utilise un tube UNIX sur une machine distante et transmet le code python compressé zlib et sérialisé à l'aide de pickle. Cela permet de l'exécuter plus rapidement et d'économiser du trafic. Si vous êtes intéressé par une explication plus détaillée, il est préférable de la lire sur la page Comment ça marche . Mais aujourd'hui, nous nous concentrerons uniquement sur la bibliothèque avec Ansible.
Mitogen dans certaines circonstances peut accélérer votre code Ansible plusieurs fois et réduire considérablement la consommation de trafic. Vérifions les cas d'utilisation les plus populaires et voyons comment cela nous aide.
J'utilise Ansible le plus pour: créer des fichiers de configuration sur une machine distante, installer des packages, copier des fichiers vers et depuis une machine distante. Vous avez peut-être d'autres exemples - écrivez dans les commentaires.
C'est parti!
La configuration de Mitogen pour Ansible est très simple:
Installez la bibliothèque Mitogen:
pip install mitogen
Il existe maintenant deux méthodes équivalentes - soit pour configurer les options dans le fichier de configuration ansible.cfg, soit pour définir les variables d'environnement nécessaires.
Supposons que le chemin d'accès au Mitogen installé soit /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. Ensuite:
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
Installez 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)
Nous faisons 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'
Essayez maintenant d'exécuter le playbook en créant des fichiers sur la 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écutez avec et sans Mitogen pour créer 10 fichiers:
time mitogen-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m2.603s user 0m1.152s sys 0m0.096s time pure-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m5.908s user 0m1.745s sys 0m0.643s
Nous constatons une amélioration de 2 fois. Vérifions 20, 30, ..., 100 fichiers:
time pure-ansible-playbook file_creation.yml -i hosts -en=100 &>/dev/null real 0m51.775s user 0m8.039s sys 0m6.305s time mitogen-ansible-playbook file_creation.yml -i hosts -en=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 sur un hôte distant à partir du local (avec module de copy
):

Script pour créer des fichiers sur un hôte distant avec module de copy
:

Scénario avec téléchargement de fichiers d'un hôte distant vers un hôte local:

Script avec création de modèles sur un hôte dédié avec quelques variables et calculs dans Jinja

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 voir, Mitogen nous fait gagner du temps et du trafic dans ces scénarios. Mais si le «goulot d'étranglement» n'est pas dans Ansible, mais par exemple dans un disque d'E / S ou un réseau, ou ailleurs, il est difficile de s'attendre à ce que Mitogen nous aide.
Essayons un script pour installer des packages avec les modules yum / dnf et python en utilisant pip. Les packages ont été mis en cache afin de ne pas dépendre des problèmes du 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 lui.
Sur la page Mitogen pour Ansible, vous pouvez voir d'autres tests et tests. Comme indiqué sur la page:
Mitogen ne peut pas accélérer un module lors de son exécution. Il 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 le déploiement et s'ils sont dus à Ansible, alors Mitogen vous aidera à les résoudre et accélérera considérablement l'exécution de vos playbooks.
modifier: script ajouté avec des modèles