Ansible beschleunigen

Ansible beschleunigen
Es ist kein Geheimnis, dass Ansible mit den Standardeinstellungen seine Arbeit nicht sehr schnell erledigen kann. In dem Artikel werde ich mehrere Gründe dafür aufzeigen und ein sinnvolles Minimum an Einstellungen anbieten, die möglicherweise tatsächlich die Geschwindigkeit Ihres Projekts erhöhen.

Hier und im Folgenden besprechen wir Ansible 2.9.x, das auf Ihre bevorzugte Weise in einer frisch erstellten virtuellen Umgebung installiert wurde.

Erstellen Sie nach der Installation eine „ansible.cfg“-Datei neben Ihrem Playbook. An diesem Speicherort können Sie diese Einstellungen zusammen mit dem Projekt übertragen und sie werden ganz automatisch geladen.

Pipelining

Einige haben möglicherweise bereits von der Notwendigkeit gehört, Pipelining zu verwenden, d bleibt eine Tatsache: diese Einstellung bleibt unterbewertet. Leider ist ein beliebter Vertrieb Linux Die Standardeinstellung für sudo war früher etwas unzureichend – es musste ein Terminal (tty) angeschlossen sein –, deshalb hat Ansible diese sehr nützliche Einstellung standardmäßig deaktiviert gelassen.

pipelining = True

Fakten sammeln

Wussten Sie, dass Ansible mit den Standardeinstellungen für jedes Spiel die Sammlung von Fakten für alle Hosts initiiert, die daran teilnehmen? Im Allgemeinen gilt: Wenn Sie es nicht wussten, wissen Sie es jetzt. Um dies zu verhindern, müssen Sie entweder den expliziten Anforderungsmodus zur Faktenerhebung (explizit) oder den Smart-Modus aktivieren. Darin werden nur Fakten von jenen Gastgebern 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 Debugging-Modus ausgeführt haben (die Option „v“, ein- bis neunmal wiederholt), ist Ihnen möglicherweise aufgefallen, dass ständig SSH-Verbindungen hergestellt und unterbrochen werden. Auch hier gibt es also ein paar Feinheiten.

Sie können den Schritt des erneuten Aufbaus einer SSH-Verbindung auf zwei Ebenen gleichzeitig vermeiden: sowohl direkt im SSH-Client als auch beim Übertragen von Dateien vom Manager auf den verwalteten Host.
Um eine offene SSH-Verbindung wiederzuverwenden, übergeben Sie einfach die erforderlichen Schlüssel an den SSH-Client. Dann beginnt es mit Folgendem: Beim ersten Aufbau einer SSH-Verbindung wird zusätzlich ein sogenannter Control-Socket erstellt, bei späteren Installationen wird die Existenz dieses Sockets überprüft und im Erfolgsfall wiederverwendet bestehende SSH-Verbindung. Und damit das alles Sinn macht, stellen wir die Zeit ein, nach der die Verbindung bei Inaktivität aufrechterhalten werden soll. Mehr können Sie hier lesen SSH-Dokumentation, und im Kontext von Ansible nutzen wir einfach die „Weiterleitung“ der notwendigen 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, geben Sie einfach eine andere unbekannte Einstellung an, ssh_tranfer_method. Die Dokumentation zu diesem Thema ist äußerst geizig und irreführend, denn diese Option funktioniert ganz gut! Aber lesen Quellcode ermöglicht Ihnen zu verstehen, was genau passieren wird: Der Befehl dd wird auf dem verwalteten Host gestartet und arbeitet direkt mit der gewünschten Datei.

transfer_method = piped

Im „develop“-Zweig gibt es diese Einstellung übrigens auch nirgendwo hingegangen.

Haben Sie keine Angst vor dem Messer, haben Sie Angst vor der Gabel

Eine weitere nützliche Einstellung sind Gabeln. Es bestimmt die Anzahl der Arbeitsprozesse, die gleichzeitig eine Verbindung zu Hosts herstellen und Aufgaben ausführen. Aufgrund der Besonderheiten von Python als Sprache werden Prozesse und keine Threads verwendet, da Ansible weiterhin Python 2.7 unterstützt – kein Asyncio für Sie, es hat keinen Sinn, hier asynchrones Verhalten einzuführen! Standardmäßig wird Ansible ausgeführt fünf Arbeiter, aber wenn man richtig fragt, wird es mehr starten:

forks = 20

Ich warne Sie nur gleich, dass es hier zu Schwierigkeiten im Zusammenhang mit der verfügbaren Speichermenge auf der Steuerungsmaschine kommen kann. Mit anderen Worten, Sie können natürlich forks=100500 setzen, aber wer hat gesagt, dass es funktionieren würde?

Alles zusammenfügen

Daher können die erforderlichen Einstellungen für ansible.cfg (INI-Format) wie folgt aussehen:

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

Und wenn man in einem normalen YaML-Inventar eines gesunden Menschen alles verstecken möchte, dann kann das etwa 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 „gathering = smart/explicit“ und „forks = 20“: Ihre YaML-Entsprechungen existieren nicht. Entweder legen wir sie in ansible.cfg fest oder wir übergeben sie über die Umgebungsvariablen ANSIBLE_GATHERING und ANSIBLE_FORKS.

Über Mitogen
- Wo ist das mit Mitogen? - Sie haben das Recht zu fragen, lieber Leser. Nirgends in diesem Artikel. Aber wenn Sie wirklich bereit sind, den Code zu lesen und herauszufinden, warum Ihr Playbook mit Mitogen abstürzt, aber mit Vanilla Ansible einwandfrei funktioniert, oder warum dasselbe Playbook zuvor einwandfrei funktionierte, aber nach einem Update anfing, seltsame Dinge zu tun – dann ist Mitogen genau das Richtige für Sie könnte möglicherweise Ihr Werkzeug sein. Wenden Sie es an, verstehen Sie es, schreiben Sie Artikel – ich werde es mit Interesse lesen.

Warum verwende ich persönlich nicht Mitogen? Denn Gladiolen funktionieren nur, solange die Aufgaben wirklich einfach sind und alles in Ordnung ist. Dreht man sich jedoch ein wenig nach links oder rechts – fertig, wir sind angekommen: Als Antwort fliegen einem eine Handvoll undeutlicher Ausnahmen entgegen, und um das Bild zu vervollständigen, fehlt nur noch der gemeinsame Satz „Vielen Dank an alle.“ , jeder ist frei.“ Generell möchte ich einfach keine Zeit damit verschwenden, die Gründe für das nächste „Klopfen im Untergrund“ herauszufinden.

Einige dieser Einstellungen wurden während des Lesevorgangs entdeckt Quellcode Verbindungs-Plugin unter dem selbsterklärenden Namen „ssh.py“. Ich teile die Ergebnisse der Lektüre in der Hoffnung, dass es jemand anderen dazu inspiriert, sich die Quellen anzusehen, sie zu lesen, die Umsetzung zu überprüfen, mit der Dokumentation zu vergleichen – schließlich wird Ihnen das alles früher oder später positive Ergebnisse bringen. Viel Glück!

An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.

Welche der folgenden Ansible-Einstellungen verwenden Sie, um Ihre Projekte zu beschleunigen?

  • 69,6%Pipelining=true32

  • 34,8%sammeln = smart/explizit16

  • 52,2%ssh_args = "-o ControlMaster=auto -o ControlPersist=..."24

  • 17,4%transfer_method = piped8

  • 63,0%Gabeln = XXX29

  • 6,5%Nichts davon, nur Mitogen3

  • 8,7%Mitogen + Ich werde notieren, welche dieser Einstellungen4

46 Benutzer haben abgestimmt. 21 Nutzer enthielten sich der Stimme.

Möchten Sie mehr über Ansible erfahren?

  • 78,3%ja, natürlich54

  • 21,7%Ja, ich will einfach mehr Hardcore-Sachen!15

  • 0,0%Nein, und es ist nicht umsonst notwendig0

  • 0,0%Nein, es ist kompliziert!!!0

69 Benutzer haben abgestimmt. 7 Benutzer enthielten sich der Stimme.

Source: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz und VPS-VDS-Servern 🔥 Kaufen Sie zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server | ProHoster