Beschleunigen Sie Ansible mit Mitogen!
→ Russische Version
Ansible ist heutzutage eines der beliebtesten Konfigurationsmanagementsysteme . Nach der Übernahme durch Red Hat im Jahr 2015 hat Ansible eine Anzahl von Tausenden von Mitwirkenden erreicht und ist möglicherweise zu einem der am häufigsten verwendeten Bereitstellungs- und Orchestrierungswerkzeuge geworden. Die Anwendungsfälle sind sehr beeindruckend.
Ansible funktioniert über SSH-Verbindungen zu Remote-Hosts. Es öffnet die SSH-Sitzung, meldet sich bei der Shell an, kopiert Python-Code über das Netzwerk und erstellt mit diesem Code eine temporäre Datei auf Remote-Hosts. Im nächsten Schritt wird die aktuelle Datei mit dem Python-Interpreter ausgeführt. All dieser Workflow ist ziemlich umfangreich und es gibt mehrere Möglichkeiten, ihn schneller und leichter zu machen.
Eine dieser Möglichkeiten ist die Verwendung von SSH-Pipelines, die eine SSH-Sitzung zum Kopieren von Python-Code mehrerer Aufgaben wiederverwenden und das Öffnen mehrerer Sitzungen verhindern, was viel Zeit spart. (Vergessen Sie nur nicht, die requiretty
Einstellungen für sudo auf der Remote-Seite in /etc/sudoers
zu deaktivieren.)
Der neue Weg, um Ansible zu beschleunigen, ist eine großartige Python-Bibliothek namens Mitogen . Wenn jemand wie ich nicht damit vertraut war, ermöglicht diese Bibliothek die schnelle Ausführung von Python-Code auf einem Remote-Host, und Ansible ist nur einer seiner Fälle. Mitogen verwendet UNIX-Pipes auf Remotecomputern, während "eingelegter" Python-Code übergeben wird, der mit zlib komprimiert wurde. Dies ermöglicht es, es schnell und ohne viel Verkehr auszuführen. Wenn Sie interessiert sind, können Sie Details darüber, wie es funktioniert, auf der Seite "Wie es funktioniert" lesen. Aber wir werden uns heute auf einen Teil von Ansible konzentrieren.
Mitogen kann unter bestimmten Umständen Ihren Ansible in wenigen Schritten beschleunigen und Ihre Bandbreite erheblich verringern. Lassen Sie uns die beliebtesten Anwendungsfälle überprüfen und herausfinden, ob dies für uns hilfreich ist.
Die beliebtesten Anwendungsfälle für die Ausführung von Ansible sind: Erstellen von Konfigurationsdateien auf einem Remote-Host, Paketinstallation, Herunterladen und Hochladen von Dateien von und zu einem Remote-Host. Vielleicht möchten Sie andere Anwendungsfälle überprüfen, bitte hinterlassen Sie Kommentare zu diesem Artikel.
Lass uns anfangen zu rollen!
Das Konfigurieren von Mitogen für Ansible ist ziemlich einfach:
Installieren Sie das Mitogen-Modul:
pip install mitogen
Dann entweder Umgebungsvariablen konfigurieren oder Konfigurationsoptionen in der Datei ansible.cfg festlegen, beide Optionen sind in Ordnung:
Nehmen wir an, /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
ist Ihr Pfad zur installierten Mitogen-Bibliothek.
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
Bereiten Sie Ansible in virtualenv mit und ohne aktiviertem Mitogen vor:
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 Sie, dass Mitogen 0.2.7 nicht mit Ansible 2.8 funktioniert (für Mai 2019)
Erstellen Sie Aliase:
alias pure-ansible-playbook='$(pwd)/pure_ansible/bin/ansible-playbook' alias mitogen-ansible-playbook='ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy:$(pwd)/mitogen_ansible/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy ANSIBLE_STRATEGY=mitogen_linear $(pwd)/mitogen_ansible/bin/ansible-playbook'
Probieren wir nun das Playbook aus, mit dem Dateien auf Remote erstellt werden:
--- - 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 }}
Und führen Sie es mit und ohne Mitogen aus, während Sie 10 Dateien erstellen:
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
Im Moment sehen wir eine Verbesserung in x2-fachen. Überprüfen wir es auf 20, 30, ..., 100 Dateien:
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
Schließlich haben wir die Ausführungszeit um mehr als das Zehnfache verbessert!
Probieren wir nun verschiedene Szenarien aus und sehen, wie es sich verbessert:
Szenario zum Hochladen von Dateien vom lokalen Host auf die Fernbedienung (mit Kopiermodul):

Szenario zum Erstellen von Dateien auf dem Remote-Host mit Kopiermodul:

Szenario mit dem Abrufen von Dateien vom Remote-Host zum lokalen:

Versuchen wir das letzte Szenario auf einigen (3) Remote-Hosts, zum Beispiel das Szenario zum Hochladen von Dateien:

Wie wir sehen können, spart uns das Mitogen in diesen Szenarien sowohl Zeit als auch Bandbreite. Aber wenn der Engpass nicht Ansible ist, sondern zum Beispiel E / A von Festplatte oder Netzwerk oder irgendwo anders, dann ist es natürlich schwer zu erwarten, dass Mitogen hilft.
Lassen Sie uns zum Beispiel die Paketinstallation mit yum / dnf und die Python-Modulinstallation mit pip ausführen.
Pakete wurden vorgespeichert, um Abhängigkeiten von Netzwerkfehlern zu vermeiden:
--- - 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
Mit Mitogen dauert es 12 Sekunden, mit reinem Ansible.
Auf der Seite Mitogen for Ansible sehen Sie zusätzliche Benchmarks und Messungen. Wie die Seite erklärt:
Mitogen kann ein Modul nach seiner Ausführung nicht verbessern, sondern nur sicherstellen, dass das Modul so schnell wie möglich ausgeführt wird
Aus diesem Grund ist es wichtig herauszufinden, wo sich Ihre Engpässe befinden, und wenn sie mit Ansible-Vorgängen zusammenhängen, hilft Mitogen Ihnen, diese zu lösen und Ihre Playbooks erheblich zu beschleunigen.