Accélérer Ansible avec Mitogen

Ansible est devenu l'un des plus populaires systÚmes de gestion de configuration. AprÚs que a été acheté par Red Hat en 2015, le nombre de participants au projet a dépassé les mille et Ansible est probablement devenu le systÚme de déploiement et d'orchestration le plus utilisé. Ses vastes domaines d'application sont trÚs impressionnants.

Ansible fonctionne via des connexions SSH vers des hÎtes distants. Il ouvre une session SSH, se connecte, copie du code Python sur le réseau et l'enregistre dans un fichier temporaire distinct. Ensuite, il exécute ce fichier sur la machine distante. Toute cette séquence d'opérations est assez longue et fastidieuse, donc il existe différentes façons de l'optimiser.

L'une de ces façons est les pipelines SSH qui permettent d'utiliser une seule session SSH pour exécuter des instructions, au lieu d'ouvrir une nouvelle session à chaque fois, ce qui peut nous faire gagner beaucoup de temps. (N'oubliez simplement pas de désactiver la requiretty dans votre fichier sudo sur la machine distante) /etc/sudoers fichier sur une machine distante)

Un nouveau moyen d'accĂ©lĂ©rer Ansible est une bibliothĂšque Python appelĂ©e Mitogen. Si quelqu'un n'en a jamais entendu parler, je vais briĂšvement en dĂ©crire la fonctionnalitĂ©. Elle permet une exĂ©cution rapide du code Python sur la machine distante et Ansible n'est qu'un des exemples d'utilisation. Mitogen utilise un pipe UNIX sur la machine distante et transmet le code Python compressĂ© avec zlib et sĂ©rialisĂ© Ă  l'aide de pickle. Cela aide Ă  l'exĂ©cuter plus rapidement et Ă©conomise de la bande passante. Si vous ĂȘtes intĂ©ressĂ© par une explication plus dĂ©taillĂ©e, il est prĂ©fĂ©rable de lire 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 bande passante. Vérifions les exemples les plus populaires d'utilisation et voyons dans quelle mesure cela nous aide.

J'utilise surtout Ansible pour : crĂ©er des fichiers de configuration sur la machine distante, installer des packages, copier des fichiers sur la machine distante et vice versa. Vous avez peut-ĂȘtre d'autres exemples - n'hĂ©sitez pas Ă  les partager dans les commentaires.

Allons-y !

La configuration de Mitogen pour Ansible est trĂšs simple :
Installer la bibliothĂšque Mitogen :

pip install mitogen

Il existe maintenant deux façons é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 Mitogen installé soit /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 un virtualenv, avec Mitogen et sans lui :

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 (en mai 2019)

Créons 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: Créer des fichiers avec le module de contenu copy
      copy:
        content: |
          fichier test {{ item }}
        dest: ~/file_{{ item }}
      with_sequence: start=1 end={{ n }}

Et exécutons avec Mitogen et sans lui 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 voyons une amélioration de 2 fois. Vérifions pour 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 fin de compte, nous avons accéléré l'exécution de plus de 10 fois !
Essayons maintenant différents scénarios et voyons combien cela fonctionne plus rapidement :

  • ScĂ©nario de copie de fichiers sur un hĂŽte distant depuis le local (avec le module copy):
    Accélérer Ansible avec Mitogen

  • ScĂ©nario de crĂ©ation de fichiers sur un hĂŽte distant avec copy le module :
    Accélérer Ansible avec Mitogen

  • ScĂ©nario de tĂ©lĂ©chargement de fichiers depuis un hĂŽte distant vers le local :
    Accélérer Ansible avec Mitogen

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

Comme on peut le voir, Mitogen nous fait économiser à la fois du temps et du trafic dans ces scénarios. Mais si le « goulot d'étranglement » n'est pas dans Ansible, mais par exemple dans l'I/O du disque ou du réseau, ou ailleurs, alors il est difficile de s'attendre à ce que Mitogen nous aide.

Essayons un scénario avec l'installation de paquets avec yum/dnf et de modules python avec pip. Les paquets ont été mis en cache pour ne pas dépendre des bugs du réseau :

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Installer des paquets
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Installer des modules pip
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Avec Mitogen, cela a pris 12 secondes, tout comme sans lui.
Sur la page Page Mitogen pour Ansible Vous pouvez consulter d'autres benchmarks et tests. Comme indiqué sur la page :

Mitogen ne peut pas accélérer un module lorsqu'il est exécuté. Il peut seulement rendre l'exécution de ce module aussi rapide que possible.

Il est donc important de trouver vos goulets d'étranglement dans le déploiement et s'ils sont causés par Ansible, Mitogen peut vous aider à les résoudre et à accélérer considérablement l'exécution de vos playbooks.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster