Wir beschleunigen Ansible mit Mitogen

Ansible wurde eines der beliebtesten Konfigurationsmanagement-Systeme. Nachdem es von Red Hat erworben wurde im Jahr 2015 überschritt die Anzahl der Projektbeteiligten die Tausende und Ansible wurde wahrscheinlich das am häufigsten verwendete System für Bereitstellung und Orchestrierung. Seine breiten Anwendungsmöglichkeiten sind sehr beeindruckend.

Ansible arbeitet über SSH-Verbindungen zu entfernten Hosts. Es öffnet eine SSH-Sitzung, meldet sich an, kopiert den Python-Code über das Netzwerk und speichert ihn in einer separaten temporären Datei. Danach führt es diese Datei auf der entfernten Maschine aus. Diese gesamte Abfolge von Operationen ist recht langwierig und mühsam, daher gibt es verschiedene Möglichkeiten, sie zu optimieren.

Eine dieser Möglichkeiten sind SSH-Pipelines , die es ermöglichen, eine SSH-Sitzung zur Ausführung von Befehlen zu verwenden, anstatt jedes Mal eine neue Sitzung zu öffnen, was viel Zeit sparen kann. (Vergessen Sie nur nicht, die requiretty -Einstellung für sudo in Ihrem /etc/sudoers Datei auf der entfernten Maschine)

Eine neue Methode, um Ansible "aufzupeppen", ist die Python-Bibliothek mit dem Namen Mitogen. Falls jemand noch nichts davon gehört hat – ich werde ihre Funktionalität kurz beschreiben. Sie ermöglicht die schnelle Ausführung von Python-Code auf einer entfernten Maschine, und Ansible ist nur ein Beispiel für die Verwendung. Mitogen verwendet UNIX-Pipes auf der entfernten Maschine und überträgt den Python-Code komprimiert mit zlib und serialisiert mit pickle. Das hilft, sie schneller auszuführen und Datenverkehr einzusparen. Wenn Sie an einer detaillierteren Erklärung interessiert sind, ist es am besten, auf der Seite "Wie es funktioniert"nachzulesen. Aber heute konzentrieren wir uns nur auf die Arbeit der Bibliothek mit Ansible.

Mitogen kann unter bestimmten Umständen Ihren Ansible-Code um ein Vielfaches beschleunigen und die Bandbreitennutzung erheblich reduzieren. Lassen Sie uns die gängigsten Anwendungsbeispiele überprüfen und sehen, wie sehr uns das hilft.

Ich benutze Ansible am häufigsten für: das Erstellen von Konfigurationsdateien auf der entfernten Maschine, die Installation von Paketen, das Kopieren von Dateien zur entfernten Maschine und zurück. Vielleicht haben Sie andere Beispiele – schreiben Sie sie in die Kommentare.

Los geht's!

Die Konfiguration von Mitogen für Ansible ist sehr einfach:
Installieren Sie die Mitogen-Bibliothek:

pip install mitogen

Nun gibt es zwei gleichwertige Möglichkeiten – entweder die Optionen in der Konfigurationsdatei ansible.cfg einzustellen oder die erforderlichen Umgebungsvariablen zu setzen.

Angenommen, der Pfad zum installierten Mitogen wäre /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Dann:

export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear

oder

[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy

Lass uns Ansible in einer virtualenv mit und ohne Mitogen installieren:

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

Bitte beachten, dass Mitogen 0.2.7 nicht mit Ansible 2.8 funktioniert (Stand Mai 2019)

Wir erstellen Aliase:

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'

Jetzt versuchen wir ein Playbook auszuführen, das Dateien auf der entfernten Maschine erstellt:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Erstelle Dateien mit dem Modul zur Inhaltenkopie
      copy:
        content: |
          Testdatei {{ item }}
        dest: ~/file_{{ item }}
      with_sequence: start=1 end={{ n }}

Und wir werden es mit und ohne Mitogen ausführen, um 10 Dateien zu erstellen:

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

Wir sehen eine Verbesserung von 2-fach. Lassen Sie uns für 20, 30, …, 100 Dateien prüfen:

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

Insgesamt haben wir die Ausführung um mehr als das 10-fache beschleunigt!
Jetzt versuchen wir verschiedene Szenarien und sehen, wie viel schneller alles funktioniert:

  • Szenario zum Kopieren von Dateien auf den entfernten Host von lokal (mit dem Modul copy):
    Wir beschleunigen Ansible mit Mitogen

  • Szenario zur Dateierstellung auf dem entfernten Host mit copy Modul:
    Wir beschleunigen Ansible mit Mitogen

  • Szenario mit dem Herunterladen von Dateien vom entfernten Host auf lokal:
    Wir beschleunigen Ansible mit Mitogen

Wir versuchen ein Szenario mit mehreren (3) entfernten Maschinen, zum Beispiel ein Szenario zum Kopieren von Dateien auf den entfernten Host:
Wir beschleunigen Ansible mit Mitogen

Wie man sieht, spart Mitogen uns sowohl Zeit als auch Bandbreite in diesen Szenarien. Wenn jedoch das "Engpass" nicht bei Ansible, sondern zum Beispiel bei I/O der Festplatte oder im Netzwerk liegt, wird es schwierig sein zu erwarten, dass Mitogen uns hilft.

Lass uns ein Szenario mit der Installation von Paketen mit yum/dnf und Python-Modulen mit pip versuchen. Die Pakete wurden zwischengespeichert, um nicht von Netzwerkanomalien abhängig zu sein:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Pakete installieren
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Pip-Module installieren
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Mit Mitogen dauerte es 12 Sekunden, wie ohne ihn.
Auf der Seite Mitogen für die Ansible-Seite Sie können sich andere Benchmarks und Tests ansehen. Wie auf der Seite angegeben:

Mitogen kann das Modul nicht beschleunigen, während es ausgeführt wird. Es kann nur die Ausführung des Moduls so schnell wie möglich gestalten.

Deshalb ist es wichtig, Ihre Engpässe bei der Bereitstellung zu finden, und wenn sie durch Ansible verursacht werden, hilft Ihnen Mitogen, diese zu lösen und die Ausführung Ihrer Playbooks erheblich zu beschleunigen.

Quelle: habr.com

60GB SSD 8Gb DDR4