Accélérer Ansible avec Mitogen

Ansible est devenu l'un des plus populaires Gestion de la configuration du système... Après a été acheté par Red Hat en 2015, le nombre participants au projet a dépassé les milliers et Ansible est probablement devenu le système de déploiement et d'orchestration le plus utilisé. Sa large gamme d'applications est très impressionnante.

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 Pipelines SSH ce qui permet d'utiliser une seule 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 d'éteindre 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 Mitogène. Si quelqu’un n’en a pas entendu parler, je vais décrire brièvement ses fonctionnalités. Il permet une exécution rapide du code Python sur une machine distante, et Ansible n'est qu'un exemple d'utilisation. Mitogen utilise un tube UNIX sur la machine distante et transfère le code python compressé avec zlib et sérialisé avec pickle. Cela permet de le terminer 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 fonctionne". Mais aujourd’hui, nous nous concentrerons uniquement sur le fonctionnement de 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. 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):
    Accélérer Ansible avec Mitogen

  • Script pour créer des fichiers sur un hôte distant avec copy module:
    Accélérer Ansible avec Mitogen

  • Scénario de téléchargement de fichiers d'un hôte distant vers un hôte local :
    Accélérer Ansible avec Mitogen

Essayons un scénario avec plusieurs (3) machines distantes, par exemple un scénario avec copie de fichiers sur un hôte distant :
Accélérer Ansible avec Mitogen

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 Page Mitogène pour Ansible vous pouvez consulter d'autres benchmarks et tests. Comme l'indique 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

Ajouter un commentaire