
Es ist kein Geheimnis, dass Ansible mit den "Standard-Einstellungen" nicht immer besonders schnell arbeitet. In diesem Artikel werde ich auf einige GrĂŒnde dafĂŒr hinweisen und ein nĂŒtzliches Minimum an Einstellungen vorschlagen, die möglicherweise die Geschwindigkeit Ihres Projekts erheblich erhöhen können.
Hier und im Folgenden besprechen wir Ansible 2.9.x, das in einer frisch erstellten virtualenv auf Ihre bevorzugte Weise installiert wurde.
Nach der Installation erstellen wir neben Ihrem Playbook die Datei "ansible.cfg" â diese Platzierung ermöglicht es, die Einstellungen zusammen mit dem Projekt zu verschieben, und sie werden zudem relativ automatisiert geladen.
Pipelining
DarĂŒber, dass Pipelining verwendet werden sollte, also nicht das Kopieren von Modulen ins Dateisystem des Zielsystems, sondern die Ăbertragung eines in Base64 kodierten Zip-Archivs direkt an stdin des Python-Interpreters, haben einige vielleicht schon gehört, andere nicht, aber die Tatsache bleibt bestehen: bleibt weiterhin unterschĂ€tzt. Leider konfigurierte eine der gĂ€ngigen Linux-Distributionen zuvor sudo nicht optimal â sodass dieser Befehl ein tty (Terminal) benötigte. Daher wurde diese sehr nĂŒtzliche Einstellung in Ansible standardmĂ€Ăig deaktiviert gelassen.
pipelining = TrueFakten sammeln
Wussten Sie, dass Ansible mit den Standardeinstellungen fĂŒr jedes Play das Sammeln von Fakten ĂŒber alle beteiligten Hosts initiiert? Wenn Sie es nicht wussten, wissen Sie es jetzt. Um dies zu vermeiden, mĂŒssen Sie entweder den expliziten Modus fĂŒr das Sammeln von Fakten (explicit) oder den intelligenten Modus aktivieren. In letzterem werden Fakten nur von den Hosts gesammelt, die in vorherigen Plays nicht aufgetaucht sind.
UPD. Beim Kopieren mĂŒssen Sie eine dieser Einstellungen auswĂ€hlen.
gathering = smart|explicitWiederverwendung von SSH-Verbindungen
Wenn Sie Ansible jemals im Debug-Modus (Option "v", die ein bis neun Mal wiederholt wird) ausgefĂŒhrt haben, haben Sie vielleicht bemerkt, dass die SSH-Verbindungen stĂ€ndig aufgebaut und getrennt wurden. Hier gibt es ebenfalls einige Feinheiten.
Den Schritt des erneuten Aufbaus der SSH-Verbindung kann man auf zwei Ebenen gleichzeitig vermeiden: sowohl im SSH-Client als auch beim Ăbertragen von Dateien an den verwalteten Host from dem Steuerungsrechner.
Um eine offene SSH-Verbindung wiederzuverwenden, reicht es aus, die benötigten SchlĂŒssel einfach an den SSH-Client zu ĂŒbergeben. Dann beginnt der Client Folgendes zu tun: Bei der ersten Einrichtung der SSH-Verbindung wird ein sogenannter Control-Socket zusĂ€tzlich erstellt, bei den folgenden Verbindungen wird die Existenz dieses Sockets ĂŒberprĂŒft, und im Erfolgsfall wird die bestehende SSH-Verbindung wiederverwendet. Damit das alles sinnvoll ist, legen wir eine Zeit fest, wie lange die Verbindung bei InaktivitĂ€t bestehen bleibt. NĂ€heres kann in der nachgelesen werden, und im Kontext von Ansible verwenden wir einfach die "Weiterleitung" der benötigten Optionen an den SSH-Client.
ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"Um eine bereits offene SSH-Verbindung beim Ăbertragen von Dateien an den verwalteten Host wiederzuverwenden, reicht es aus, eine weitere unbekannte Einstellung, ssh_transfer_method, anzugeben. Die Dokumentation dazu ist Ă€uĂerst und fĂŒhrt in die Irre, denn diese Option funktioniert durchaus! Das Lesen erlaubt zu verstehen, was genau passieren wird: Auf dem verwalteten Host wird der Befehl dd ausgefĂŒhrt, der direkt mit der benötigten Datei arbeitet.
transfer_method = pipedĂbrigens gibt es diese Einstellung auch im Develop-Zweig, und .
FĂŒrchte das Messer nicht, fĂŒrchte die Gabel.
Eine weitere nĂŒtzliche Einstellung ist forks. Diese legt die Anzahl der Arbeitsprozesse fest, die gleichzeitig mit den Hosts verbunden werden und Aufgaben ausfĂŒhren. Aufgrund der Eigenschaften von Python als Programmiersprache werden genau Prozesse und nicht Threads verwendet, da Ansible weiterhin Python 2.7 unterstĂŒtzt â keine asyncio, hier gibt es nichts, was asynchron gemacht werden mĂŒsste! StandardmĂ€Ăig startet Ansible Worker, aber wenn man richtig danach fragt, kann er auch mehr starten:
forks = 20Ich warne vorab, dass es hier einige Schwierigkeiten geben kann, die mit dem vorhandenen Speicher auf dem verwaltenden GerÀt zusammenhÀngen. Anders gesagt, es mag zwar möglich sein, forks=100500 zu setzen, aber wer hat gesagt, dass das funktioniert?
Kommen wir alles zusammen.
FĂŒr ansible.cfg (INI-Format) könnten die erforderlichen Einstellungen so aussehen:
[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped
Und wenn du alles in einem ordentlichen YAML-Inventar eines gesunden Menschen verstecken möchtest, könnte es etwa so aussehen:
---
all:
vars:
ansible_ssh_pipelining: true
ansible_ssh_transfer_method: piped
ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m
Leider wird dies mit den Einstellungen âgathering = smart/explicitâ und âforks = 20â nicht funktionieren: Ihre YaML-Ăquivalente existieren nicht. Entweder definieren wir sie in ansible.cfg oder ĂŒbergeben sie ĂŒber die Umgebungsvariablen ANSIBLE_GATHERING und ANSIBLE_FORKS.
Ăber Mitogen
â Wo steht hier etwas ĂŒber Mitogen? â könntest du, verehrter Leser, fragen. In diesem Artikel â nirgendwo. Aber wenn du wirklich bereit bist, seinen Code zu lesen und zu verstehen, warum dein Playbook mit Mitogen fehlschlĂ€gt, wĂ€hrend es mit Vanilla Ansible einwandfrei funktioniert, oder warum dasselbe Playbook bisher immer korrekt lief und nach dem Update merkwĂŒrdig wurde â nun, Mitogen könnte potenziell dein Werkzeug sein. Wende es an, beschĂ€ftige dich damit, schreibe Artikel â ich lese sie mit Interesse.
Warum ich persönlich Mitogen nicht verwende? Weil er nur funktioniert, solange die Aufgaben wirklich einfach sind und alles gut lĂ€uft. Sobald man etwas nach links oder rechts abweicht â vorbei: Eine Handvoll verwirrender Ausnahmen kommt zurĂŒck, und um das Bild abzurunden, fehlt nur der gĂ€ngige Satz âDanke an alle, ihr seid entlassen.â Zusammenfassend möchte ich einfach keine Zeit damit verbringen, die Ursachen des nĂ€chsten âunterirdischen Klopfensâ herauszufinden.
Einige dieser Einstellungen wurden wĂ€hrend der LektĂŒre des Verbindungs-Plugins mit dem sprechenden Namen âssh.pyâ entdeckt. Ich teile die Ergebnisse der LektĂŒre in der Hoffnung, dass es noch jemanden inspiriert, in den Quellcode zu schauen, ihn zu lesen, die Implementierung zu ĂŒberprĂŒfen und mit der Dokumentation zu vergleichen â denn das wird dir frĂŒher oder spĂ€ter positive Ergebnisse bringen. Viel GlĂŒck!
Nur registrierte Benutzer können an der Umfrage teilnehmen. .
Welche der genannten Ansible-Einstellungen zur Beschleunigung deiner Projekte verwendest du?
69,6%pipelining = true32
34,8%gathering = smart/explicit16
52,2%ssh_args = "-o ControlMaster=auto -o ControlPersist=âŠ"24
17,4%transfer_method = piped8
63,0%forks = XXX29
6,5%Nichts davon, nur Mitogen3
8,7%Mitogen + ich werde hervorheben, welche dieser Einstellungen genau4
46 Benutzer haben abgestimmt. 21 Benutzer haben sich enthalten.
Möchtest du noch mehr ĂŒber Ansible erfahren?
78,3%Ja, natĂŒrlich54
21,7%Ja, ich möchte nur mehr Hardcore-Dinge!15
0,0%Nein, und das brauche ich nicht0
0,0%Nein, zu kompliziert!!!0
69 Benutzer haben abgestimmt. 7 Benutzer haben sich enthalten.
Quelle: habr.com
