Ich habe einige seltsame Probleme mit meiner Ansible-Box (Vagrant).
Alles hat gestern funktioniert und mein Spielbuch hat gut funktioniert.
Heute hängt ansible am "Sammeln von Fakten"?
Hier ist die ausführliche Ausgabe:
<5.xxx.xxx.xxx> ESTABLISH CONNECTION FOR USER: deploy
<5.xxx.xxx.xxx> REMOTE_MODULE setup
<5.xxx.xxx.xxx> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-
o', 'ControlPersist=60s', '-o', 'ControlPath=/home/vagrant/.ansible/cp/ansible-s
sh-%h-%p-%r', '-o', 'Port=2221', '-o', 'KbdInteractiveAuthentication=no', '-o',
'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o
', 'PasswordAuthentication=no', '-o', 'User=deploy', '-o', 'ConnectTimeout=10',
'5.xxx.xxx.xxx', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1411372677
.18-251130781588968 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1411372677.18-2
51130781588968 && echo $HOME/.ansible/tmp/ansible-tmp-1411372677.18-251130781588
968'"]
vagrant ssh
, während des Hangs zu untersuchen, ob inps
und etwas Nützliches enthalten istnetstat
? Einer der ersten Verdächtigen in Hangs ist DNS. Überprüfen Sie, ob DNS von der virtuellen Maschine aus aufgelöst wird.Antworten:
Ich hatte ein ähnliches Problem mit Ansible Ping auf Vagrant, es blieb einfach plötzlich ohne Grund hängen und hat zuvor absolut einwandfrei funktioniert. Im Gegensatz zu anderen Problemen wie ssh oder Verbindungsproblemen stirbt es einfach für immer ohne Zeitüberschreitung.
Eine Sache, die ich getan habe, um dieses Problem zu beheben, ist, das
~/.ansible
Verzeichnis zu bereinigen und es funktioniert einfach wieder. Ich kann nicht herausfinden warum, aber es wurde behoben.Wenn Sie Änderungen haben, versuchen Sie, den
~/.ansible
Ordner zu säubern, bevor Sie Ihren Vagrant aktualisieren.quelle
rm -rf ~/.ansible
hat bei El CaptitanFür mich steckte das Setup-Modul Modul auf einem toten NFS-Mount.
Wenn Sie ein "df" auf Ihrem Computer ausführen und nichts passiert, befinden Sie sich möglicherweise im selben Fall.
PS: Wenn Sie die NFS-Freigabe / den Mountpoint nicht ummounten können, ziehen Sie die Verwendung des falschen "umount -l" in Betracht.
quelle
gather_facts
,False
aber dieser Tipp hat mir wirklich den Tag gerettet, denn das war auch mein Problem.Ansible kann aus verschiedenen Gründen so hängen bleiben, normalerweise aufgrund eines Verbindungsproblems oder weil das Setup-Modul hängt. Hier erfahren Sie, wie Sie das Problem eingrenzen, damit Sie es lösen können.
Ansible kann keine Verbindung zum Zielhost herstellen
Probleme mit dem Hostschlüssel (known_hosts)
1) In älteren Ansible-Versionen (2.1 oder älter) werden Sie von Ansible nicht immer darüber informiert, ob der Host-Schlüssel für das Ziel in der Quelle nicht vorhanden ist oder ob eine Nichtübereinstimmung vorliegt.
Lösung: Versuchen Sie, eine SSH-Verbindung mit denselben Parametern zu diesem Ziel zu öffnen. Möglicherweise finden Sie SSH-Fehler, die Sie beheben müssen, und der Befehl funktioniert dann.
2) Manchmal zeigt Ansible Ihnen eine SSH-Verbindungsnachricht inmitten anderer Status an, wodurch Ansible bei dieser Aufgabe "einfriert":
In diesem Fall können Sie das Spiel fortsetzen, indem Sie einfach "Ja" für so viele SSH-Fragen eingeben, wie Sie gefragt wurden. Anschließend können Sie die Probleme mit root known_hosts beheben.
Probleme bei der Authentifizierung mit privaten Schlüsseln
Bei Verwendung der schlüsselbasierten Authentifizierung im Vergleich zum Kennwort treten unter anderem folgende Probleme auf:
Lösung: Versuchen Sie,
ansible -m ping <destination> -k
gegen den problematischen Host zu laufen. Wenn dies nicht funktioniert, versuchen Sie die oben beschriebenen Lösungen für Host-Schlüsselprobleme .Ansible kann nicht schnell Fakten sammeln
Das
setup
Modul kann (wenn es zu Beginn eines Laufs automatischansible-playbook
ausgeführt wird oder wenn es manuell ausgeführt wird alsansible -m setup <host>
) häufig hängen bleiben, wenn Hardwarefakten erfasst werden (z. B. wenn Festplatteninformationen von Hosts mit hoher E / A, fehlerhaften Mount-Einträgen usw. abgerufen werden).Lösung: Laufen Sie
ansible -m setup -a gather_subset=!all <destination>
. Wenn dies funktioniert, sollten Sie diese Zeile in Ihrer ansible.cfg einstellen:quelle
ssh-keygen -R
Befehl zum Entfernen des fehlerhaften Schlüssels ausführte. Ich habe ssh einmal ausgeführt, um den Schlüssel hinzuzufügen, aber der zweite Lauf hing. Als ich ssh erneut ausführte, wurde ich zur Bestätigung des Schlüssels aufgefordert, was unerwartet war. Ich erkannte, dass es einen fehlerhaften Schlüssel gibt, der entfernt werden musste. Nachdem ich diesen entfernt und ssh erneut ausgeführt hatte, erhielt ich dieWarning: Permanently added the ECDSA host key ...
Nachricht und nur das Sammeln von Fakten wurde fortgesetzt.Ich hatte ein ähnliches Problem mit Ansible beim Sammeln von Fakten. Ich habe mein Skript auf eine Eingabeaufforderung ohne Aufgaben oder Rollen reduziert und es hing immer noch.
Ich habe in meiner Prozessliste 12 nicht reagierende Prozesse gefunden, die sich im Laufe des Tages angesammelt haben.
Sobald ich diese getötet hatte, fing es wieder an zu funktionieren.
quelle
Es gibt viele Gründe, warum ein Problem beim Sammeln von Fakten auftreten kann. Bevor Sie jedoch fortfahren, finden Sie hier den ersten Test, den Sie in einer solchen Situation durchführen sollten:
Dieser Test stellt nur eine Verbindung zum Host her und führt ausreichend Code aus, um Folgendes zurückzugeben:
Wenn dies funktioniert, können Sie Setup- oder Konnektivitätsprobleme so gut wie ausschließen, da dies beweist, dass Sie den Hostnamen des Ziels auflösen, eine Verbindung herstellen, authentifizieren und ein ansprechbares Modul mit dem Remote-Python-Interpreter ausführen können.
Hier ist eine (nicht vollständige) Liste von Dingen, die am Anfang eines Spielbuchs schief gehen können:
Der von ansible ausgeführte Befehl wartet auf eine interaktive Eingabe
Ich kann mich daran erinnern, dass dies bei älteren Ansible-Versionen der Fall war, bei denen ein Befehl auf eine interaktive Eingabe wartete, die niemals eintrat, z. B. ein Sudo-Passwort (wenn Sie einen
-K
Schalter vergessen haben ) oder die Annahme eines neuen SSH-Host-Fingerabdrucks (für ein neues Ziel) Wirt).Moderne Versionen von ansible behandeln beide Fälle problemlos und lösen in normalen Fällen sofort einen Fehler aus. Wenn Sie also nicht selbst ssh oder sudo aufrufen, sollten Sie diese Art von Problem nicht haben. Und selbst wenn Sie es taten, würde es sich nachträglich versammeln.
Dead SSH-Master-Verbindung
Es gibt einige sehr interessante Optionen, die dem ssh-Client im hier angegebenen Debug-Protokoll übergeben wurden:
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
Diese Optionen sind in man ssh_config dokumentiert .
Standardmäßig versucht ansible, die Verwendung der SSH-Verbindung zu optimieren. Anstatt für einen bestimmten Host eine neue Verbindung für jede einzelne Aufgabe im Spiel zu erstellen, wird diese einmal geöffnet und für das gesamte Spielbuch (und sogar für alle Spielbücher) geöffnet.
Das ist gut so, denn das Herstellen einer neuen Verbindung ist weitaus langsamer und rechenintensiver als das Verwenden einer bereits vorhandenen.
In der Praxis prüft jede SSH-Verbindung, ob ein Socket an vorhanden ist
~/.ansible/cp/some-host-specific-path
. Die erste Verbindung kann es nicht finden, daher wird die Verbindung normal hergestellt und anschließend erstellt. Jede nachfolgende Verbindung wird dann nur diese Buchse verwenden, um die bereits hergestellte Verbindung zu durchlaufen.Auch wenn die hergestellte Verbindung nach einer langen Zeitspanne abläuft und geschlossen wird, wird auch der Socket geschlossen, und wir kehren zum ersten Punkt zurück.
So weit, ist es gut.
Manchmal bricht die Verbindung jedoch tatsächlich ab, der ssh-Client betrachtet sie jedoch weiterhin als hergestellt. Dies passiert normalerweise, wenn Sie das Playbook von Ihrem Laptop aus ausführen und Ihre WLAN-Verbindung verlieren (oder von WLAN auf Ethernet usw. wechseln).
Dieses letzte Beispiel ist eine schreckliche Situation: Sie können mit einer Standard-ssh-Konfiguration ssh auf den Zielcomputer senden, aber solange Ihre vorherige Verbindung noch als aktiv angesehen wird, wird ansible nicht einmal versuchen, eine neue herzustellen.
An dieser Stelle wollen wir nur diesen alten Socket loswerden, und der einfachste Weg, dies zu tun, besteht darin, ihn zu entfernen:
Dies ist ideal für eine einmalige Korrektur. Wenn dies jedoch zu häufig vorkommt, müssen Sie möglicherweise nach einer längerfristigen Korrektur suchen. Hier sind einige Hinweise, die zu diesem Ziel beitragen könnten:
Bitte beachten Sie, dass sich zum Zeitpunkt des Schreibens einige Optionen geändert haben (z. B. hat mir mein letzter Lauf gezeigt
ControlPath=/home/toadjaune/.ansible/cp/871b533295
), aber die allgemeine Idee ist immer noch gültig.Das Sammeln von Fakten nimmt tatsächlich zu viel Zeit in Anspruch
Zu Beginn jedes Spiels sammelt ansible viele Informationen über das Zielsystem und fügt sie in Fakten ein . Dies sind Variablen, die Sie dann in Ihrem Playbook verwenden können und die normalerweise sehr nützlich sind. Manchmal kann es jedoch sehr lang sein, diese Informationen zu erhalten (schlechte Mount-Punkte, Festplatten mit hoher E / A-Rate, hoher Last…).
Abgesehen davon benötigen Sie nicht unbedingt Fakten, um ein Playbook zu erstellen, und mit ziemlicher Sicherheit nicht alle. Lassen Sie uns also versuchen, das zu deaktivieren, was wir nicht benötigen. Dafür gibt es mehrere Möglichkeiten:
Für Debugging-Zwecke ist es sehr praktisch, das Setup-Modul direkt über die Befehlszeile aufzurufen:
Dieser letzte Befehl sollte ebenso wie Ihr Playbook hängen bleiben und eventuell eine Zeitüberschreitung (oder eine erfolgreiche Zeitüberschreitung) verursachen. Führen wir nun das Modul erneut aus und deaktivieren alles, was wir können:
Wenn dies immer noch nicht funktioniert, können Sie jederzeit versuchen, das Modul in Ihrem Spiel vollständig zu deaktivieren, aber es ist sehr wahrscheinlich, dass Ihr Problem an einer anderen Stelle auftritt.
Wenn es jedoch gut (und schnell) funktioniert, schauen Sie in die Dokumentation des Moduls . Sie haben zwei Möglichkeiten:
gather_subset
).gather_timeout
kann Ihnen auch dabei helfen, Ihr Problem zu beheben, indem Sie mehr Zeit einplanen (obwohl dies einen Timeout-Fehler und keinen Stillstand bedeuten würde).Andere Probleme
Offensichtlich können andere Dinge schief gehen. Einige Hinweise zum Debuggen:
-vvvv
), da sie Ihnen jeden ausgeführten Befehl anzeigtping
undsetup
Module direkt über die Befehlszeile, wie oben erläutertansible -m ping
dies nicht funktioniertquelle
Dmytro ist auf etwas!
Ansible verwendet den FQDN des Hosts. Wenn Ihr Host nicht über DNS aufgelöst werden kann und Sie keine Zuordnung in
/etc/hosts
Ansible haben, wartet er auf eine Zeitüberschreitung des DNS.Durch Hinzufügen
::1 <fqdn>
der Hostdatei der Computer, die Sie mit Ansible verbinden, wird der FQDN sofort abgerufen, ohne dass DNS verwendet wird.Beachten Sie, dass der Host nach Hosts suchen sollte.
/etc/hosts
Dies ist die Standardeinstellung für die meisten, wenn nicht alle Linux-Systeme, aber auch für Ihre Bearbeitung/etc/nsswitch.conf
kann dies ein Problem sein.quelle
Ich hatte das gleiche Problem. Ich habe keine nützlichen Informationen erhalten, weil ich ansible im ausführlichen Modus ausgeführt habe.
Der Server wurde vor dem Ausführen des Playbooks erneut bereitgestellt.
Das Entfernen des Servers von der Liste bekannter Hosts behebt dies mit dem folgenden Befehl.
Hinweis: Sie müssen sowohl den Hostnamen als auch die IP-Adresse entfernen
quelle
Ich weiß nicht, ob Sie ein Sudo-Playbook verwenden - aber das war ich und es hing am Sudo-Passwort.
Aus der Dokumentation - Sie können das töten und dann auch verwenden
-K
.Viel Glück.
quelle
Möglicherweise hat sich der Fingerprint Ihres Zielsystems geändert, z. B. wenn Sie das Server-Betriebssystem neu installieren. Sie müssen die Einträge in known_hosts löschen , ansible benachrichtigt Sie nicht darüber , dass es sich um einen nicht vertrauenswürdigen Eintrag handelt, sondern steckt nur genau so fest, wie Sie es beschreiben.
quelle
Es hört sich so an, als ob Ansible sich nicht authentifizieren kann. Verwenden Sie also -k, um Ansible nach dem Server-Passwort fragen zu lassen.
quelle
Ein nicht übereinstimmender FQDN und Hostname kann ebenfalls zu einem anstößigen Hangout führen. Ich habe FQDN mit Domäne verwendet, unterscheidet sich von Hostname-Domäne. Nachdem beide gleich sind , funktioniert ansible perfekt. Möglicherweise kann ein Vergleich von FQDN und Hostname durchgeführt werden, bevor Aufgaben auf einem Remote-Host ausgeführt werden. Ich hoffe es hilft!
quelle
Ich habe dieses Problem gelöst, indem ich die Vagabund-Box zurückgesetzt habe
quelle
In meinem Fall hat ansible mitten in einer Aufgabe aufgehört zu arbeiten. Der Grund war, dass mein SSH-Agent nicht mehr funktionierte (
ssh-add -l
er gab nichts zurück). Ich habe alles neu gestartet und es hat wieder funktioniert. Überprüfen Sie also, ob Ihr ssh-agent ordnungsgemäß funktioniert (ssh-add -l
sollte nicht hängen bleiben).quelle
~/.ansible
Alleine löschen hat mir nicht geholfen . Um zu überprüfen, was sich in diesem Verzeichnis befindet, habe ich einfach die Tastenkombination Strg-Z (Prozess in den Ruhezustand versetzen) ausgeführt und überprüft und dann den anonymen Prozess über fortgesetztfg
. In diesem Fall habe ich nichts gelöscht. aber danach ging es einfach weiter. Also habe ich einfach die Strg-Z->fg
alleine ausprobiert und es hat auch geklappt . Fühlt sich an wie Regentanz, aber wenn jemand anderes feststeckt, versuchen Sie das bitte auch.quelle
Ich habe die Ursache für dieses Problem behoben, indem ich den Rat befolgt habe, warum mein Ansible-Playbook unter "Fakten sammeln" hängt. Blogeintrag.
Es kann vereinfacht werden:
Festlegen
DEFAULT_KEEP_REMOTE_FILES=yes
, dass die Befehle beibehalten und aktiviert werden-vvvv
Führen Sie das Playbook erneut aus.
Wenn das Spiel hängen bleibt, kopiere den zuletzt gedruckten Shell-Befehl (den Teil danach
/bin/sh -c
)Melden Sie sich am Server über an
ssh
.Verwenden Sie
strace
diese Taste, um den letzten Schritt des Spiels erneut abzuspielen. Der Schrittbefehl wird aus der-vvv
Ausgabe kopiert . Zum Beispiel:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"
Überprüfe, bei welchem Aufruf der "gespannte" Schritt hängen geblieben ist und behebe es :)
In meinem Fall war es ein unzugängliches Netzlaufwerk ...
quelle
Sudos Passwort ist das Problem. Stellen Sie sicher, dass (1) Sie "sudo anything " auf dem neu geöffneten Terminal ausgeben können (wobei das Kennwort nicht zwischengespeichert ist), ohne eine (2) anzugeben, die Puppe Ihre früheren manuellen Änderungen an "sudoers" nicht rückgängig gemacht hat.
quelle