Beschleunigen Sie Ansible

Turbolader


Es ist kein Geheimnis, dass Ansible mit den Standardeinstellungen seine Arbeit möglicherweise nicht sehr schnell erledigt. In dem Artikel werde ich einige Gründe dafür aufzeigen und ein nützliches Minimum an Einstellungen anbieten, die möglicherweise die Geschwindigkeit Ihres Projekts wirklich erhöhen.



Wir diskutieren hier und weiter Ansible 2.9.x, das in der frisch erstellten virtuellen Umgebung auf Ihre bevorzugte Weise installiert wurde.



Nach der Installation erstellen wir eine Datei "ansible.cfg" neben Ihrem Playbook. An diesem Speicherort können Sie diese Einstellungen zusammen mit dem Projekt übertragen und sie werden ganz automatisch geladen.



Pipelining



Jemand konnte bereits von der Notwendigkeit hören, Pipelining zu verwenden, dh keine Module in den FS des Zielsystems zu kopieren, sondern ein in Base64 verpacktes Zip-Archiv direkt auf den Standard des Python-Interpreters zu übertragen, aber die Tatsache bleibt bestehen : Diese Einstellung wird immer noch unterschätzt. Leider waren einige der gängigen Linux-Distributionen, die zum Konfigurieren von sudo verwendet wurden, standardmäßig nicht sehr gut - so dass für diesen Befehl ein tty (Terminal) erforderlich war, ließ Ansible diese sehr nützliche Einstellung standardmäßig deaktiviert.



pipelining = True


Fakten sammeln



Wussten Sie, dass Ansible mit den Standardeinstellungen für jedes Spiel die Erfassung von Fakten von allen Hosts initiiert, die daran teilnehmen? Wenn Sie es nicht wussten, wissen Sie es jetzt. Um dies zu verhindern, müssen Sie entweder den expliziten Anforderungsmodus zum Sammeln von Fakten (explizit) oder den Smart-Modus aktivieren. Darin werden Fakten nur von den Hosts gesammelt, die in früheren Spielen nicht angetroffen wurden.

UPD. Beim Kopieren müssen Sie eine dieser Einstellungen auswählen.



gathering = smart|explicit


Wiederverwendung von SSH-Verbindungen



Wenn Sie Ansible jemals im Debug-Modus gestartet haben (Option "v" ein- bis neunmal wiederholt), haben Sie möglicherweise bemerkt, dass ständig SSH-Verbindungen hergestellt und getrennt werden. Es gibt hier also auch ein paar Feinheiten.



Sie können vermeiden, dass eine SSH-Verbindung auf zwei Ebenen gleichzeitig wiederhergestellt wird: sowohl direkt im SSH-Client als auch beim Übertragen von Dateien von einem Manager auf einen verwalteten Host.

Um eine offene SSH-Verbindung wiederzuverwenden, übergeben Sie einfach die erforderlichen Schlüssel an den SSH-Client. Dann wird er Folgendes tun: Wenn Sie zum ersten Mal eine SSH-Verbindung herstellen, erstellen Sie zusätzlich einen sogenannten Control-Socket für nachfolgende - überprüfen Sie das Vorhandensein dieses Sockets und verwenden Sie bei Erfolg die vorhandene SSH-Verbindung erneut. Damit dies alles Sinn macht, legen wir die Zeit fest, um die Verbindung zu speichern, wenn sie inaktiv ist. Weitere Details finden Sie in der ssh-Dokumentation . Im Kontext von Ansible verwenden wir einfach die "Weiterleitung" der erforderlichen Optionen an den ssh-Client.



ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"


Um eine bereits geöffnete SSH-Verbindung beim Übertragen von Dateien auf einen verwalteten Host wiederzuverwenden, müssen Sie nur eine weitere unbekannte Einstellung ssh_tranfer_method angeben. Die Dokumentation zu diesem Thema ist äußerst spärlich und irreführend, da diese Option für sich selbst funktioniert! Durch Lesen des Quellcodes können Sie jedoch verstehen, was genau passieren wird: Der Befehl dd wird auf dem verwalteten Host gestartet und arbeitet direkt mit der erforderlichen Datei.



transfer_method = piped


Übrigens existiert diese Einstellung im Zweig "Entwickeln" auch und ist nirgendwo hingegangen .



Fürchte dich nicht vor dem Messer, fürchte dich vor der Gabel



Eine weitere nützliche Einstellung sind Gabeln. Es bestimmt die Anzahl der Worker-Prozesse, die gleichzeitig eine Verbindung zu Hosts herstellen und Aufgaben ausführen. Aufgrund der Besonderheiten von Python werden Prozesse als PL und nicht als Threads verwendet, da Ansible weiterhin Python 2.7 unterstützt - kein Asyncio für Sie, hier gibt es nichts, was Asynchronität erzeugen könnte! Standardmäßig startet Ansible fünf Worker, aber wenn es richtig gefragt wird, werden mehr ausgeführt:



forks = 20


Ich warne Sie nur sofort, dass mit der verfügbaren Speichermenge auf dem Steuergerät einige Schwierigkeiten verbunden sein können. Mit anderen Worten, Sie können natürlich Gabeln = 100500 setzen, aber wer hat gesagt, dass es funktionieren wird?



Alles zusammenfügen



Infolgedessen können für ansible.cfg (INI-Format) die erforderlichen Einstellungen folgendermaßen aussehen:



[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped


Und wenn Sie alles im normalen YaML-Inventar einer gesunden Person verstecken möchten, könnte es ungefähr so ​​aussehen:



---
all:
  vars:
    ansible_ssh_pipelining: true
    ansible_ssh_transfer_method: piped
    ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m


Leider funktioniert dies nicht mit den Einstellungen "sammeln = intelligent / explizit" und "Gabeln = 20": Es gibt keine YaML-Entsprechungen. Entweder setzen wir sie in ansible.cfg oder übergeben sie durch die Umgebungsvariablen ANSIBLE_GATHERING und ANSIBLE_FORKS.



Über Mitogen
— Mitogen? — , . — . , Mitogen, Ansible , , — , Mitogen . , , — .



Mitogen? , . — , : , « , ». , « ».



Einige dieser Einstellungen wurden beim Lesen des Quellcodes des Verbindungs-Plugins unter dem selbsterklärenden Namen "ssh.py" entdeckt. Ich teile die Ergebnisse des Lesens in der Hoffnung, dass es jemand anderen dazu inspiriert, sich die Quelle anzusehen, sie zu lesen, die Implementierung zu überprüfen und mit der Dokumentation zu vergleichen - schließlich bringt Ihnen all dies früher oder später positive Ergebnisse. Viel Glück!



All Articles