Ansible mit Mitogen beschleunigen

Ansible wurde zu einem der beliebtesten Systemkonfigurationsmanagement. Nachdem wurde von Red Hat gekauft im Jahr 2015 die Zahl Projektteilnehmer überstieg Tausende und Ansible wurde wahrscheinlich zum am häufigsten verwendeten Bereitstellungs- und Orchestrierungssystem. Sein breites Anwendungsspektrum ist sehr beeindruckend.

Ansible funktioniert über SSH-Verbindungen zu Remote-Hosts. Es öffnet eine SSH-Sitzung, meldet sich an, kopiert den Python-Code über das Netzwerk und schreibt ihn in eine separate temporäre Datei. Anschließend wird diese Datei auf dem Remote-Computer ausgeführt. Diese ganze Abfolge von Vorgängen ist ziemlich langwierig und mühsam, daher gibt es verschiedene Möglichkeiten, sie zu optimieren.

Eine dieser Möglichkeiten ist SSH-Pipelines Dadurch können Sie eine SSH-Sitzung zum Ausführen von Anweisungen verwenden, anstatt jedes Mal eine neue Sitzung zu öffnen, was uns viel Zeit sparen kann. (Denken Sie daran, es auszuschalten requiretty Einstellung für Sudo in Ihrem /etc/sudoers Datei auf dem Remote-Computer)

Eine neue Möglichkeit, Ansible zu übertakten, ist eine Python-Bibliothek namens Mitogen. Falls jemand noch nichts davon gehört hat, beschreibe ich kurz seine Funktionsweise. Es ermöglicht die schnelle Ausführung von Python-Code auf einem Remote-Rechner und Ansible ist nur ein Anwendungsbeispiel. Mitogen verwendet eine UNIX-Pipe auf dem Remote-Computer und überträgt mit zlib komprimierten und mit pickle serialisierten Python-Code. Dies hilft, den Vorgang schneller abzuschließen und Verkehr zu sparen. Wenn Sie an einer ausführlicheren Erklärung interessiert sind, lesen Sie am besten auf der Seite nach "Wie es funktioniert". Heute konzentrieren wir uns jedoch nur auf die Funktionsweise der Bibliothek mit Ansible.

Unter bestimmten Umständen kann Mitogen Ihren Ansible-Code um ein Vielfaches beschleunigen und den Verkehrsverbrauch erheblich reduzieren. Schauen wir uns die beliebtesten Anwendungsfälle an und sehen, wie sehr es uns hilft.

Ich verwende Ansible am häufigsten zum Erstellen von Konfigurationsdateien auf einem Remote-Computer, zum Installieren von Paketen und zum Kopieren von Dateien zum und vom Remote-Computer. Vielleicht haben Sie noch andere Beispiele – schreiben Sie in die Kommentare.

Lassen Sie uns gehen!

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

pip install mitogen

Nun gibt es zwei äquivalente Möglichkeiten: entweder die Optionen in der Konfigurationsdatei ansible.cfg konfigurieren oder die erforderlichen Umgebungsvariablen festlegen.

Nehmen wir an, dass der Pfad zum installierten Mitogen lautet /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

Lassen Sie uns Ansible in Virtualenv installieren, mit und ohne 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

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

Aliase erstellen:

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'

Versuchen wir nun, ein Playbook auszuführen, das Dateien auf einem Remote-Computer erstellt:

---
- 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 lassen Sie es uns 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 zweifache Verbesserung. Lassen Sie uns nach 2, 20, ..., 30 Dateien suchen:

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

Dadurch haben wir die Ausführung um mehr als das Zehnfache beschleunigt!
Probieren wir nun verschiedene Szenarien aus und sehen, wie viel schneller bei uns alles funktioniert:

  • Skript zum Kopieren von Dateien von einem lokalen auf einen Remote-Host (mit dem Modul copy):
    Ansible mit Mitogen beschleunigen

  • Skript zum Erstellen von Dateien auf einem Remote-Host mit copy Modul:
    Ansible mit Mitogen beschleunigen

  • Szenario mit dem Herunterladen von Dateien von einem Remote-Host auf einen lokalen:
    Ansible mit Mitogen beschleunigen

Versuchen wir ein Szenario mit mehreren (3) Remote-Rechnern, zum Beispiel ein Szenario mit dem Kopieren von Dateien auf einen Remote-Host:
Ansible mit Mitogen beschleunigen

Wie Sie sehen, spart uns Mitogen in diesen Szenarien sowohl Zeit als auch Verkehr. Aber wenn der Engpass nicht in Ansible liegt, sondern zum Beispiel im I/O einer Festplatte oder eines Netzwerks oder woanders, dann ist es schwer zu erwarten, dass Mitogen uns helfen wird.

Versuchen wir es mit einem Skript zur Installation von Paketen mit yum/dnf- und Python-Modulen mithilfe von pip. Die Pakete wurden zwischengespeichert, um nicht von Netzwerkstörungen abhängig zu sein:

---
- 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 dauerte es 12 Sekunden, genauso wie ohne.
Auf Seite Mitogen für Ansible-Seite Sie können sich andere Benchmarks und Tests ansehen. Auf der Seite heißt es:

Mitogen kann das Modul nicht beschleunigen, wenn es läuft. Es kann nur die Ausführung dieses Moduls so schnell wie möglich machen.

Daher ist es wichtig, Ihre Engpässe in Ihrer Bereitstellung zu finden. Wenn diese auf Ansible zurückzuführen sind, hilft Ihnen Mitogen bei der Lösung dieser Engpässe und beschleunigt die Ausführung Ihrer Playbooks erheblich.

Source: habr.com

Kommentar hinzufügen