Ansible blieb beim Sammeln von Fakten stecken

52

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'"]
Bj Blazkowicz
quelle
1
Wie lange hängt es? Haben Sie versucht vagrant ssh, während des Hangs zu untersuchen, ob in psund etwas Nützliches enthalten ist netstat? Einer der ersten Verdächtigen in Hangs ist DNS. Überprüfen Sie, ob DNS von der virtuellen Maschine aus aufgelöst wird.
Antonis Christofides
1
Danke für deinen Kommentar. Die Lösung war einfach, vagabundierend, zerstörerisch und vagabundierend ... Ich finde es immer noch seltsam, dass es einfach nicht mehr funktioniert?
Bj Blazkowicz
1
Ich hatte ein Problem damit, dass Ansible ausfiel, wenn es ein unzugängliches (cifs-) Reittier gab.
Gezeiten
1
Sollte dies geschehen sein, wurde dies durch einen veralteten Hostschlüssel in der Datei known_hosts verursacht. Seltsam, dass die Verbindung in diesem Fall nicht wie üblich fehlgeschlagen ist.
GnP
Können Sie sshd-Protokolle in der vagrant-Box überprüfen? Möglicherweise müssen Sie "LogLevel DEBUG" in / etc / ssh / sshd_config einstellen, aber das kann weitere Informationen darüber liefern, was los ist.
Pablo Martinez

Antworten:

31

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 ~/.ansibleVerzeichnis zu bereinigen und es funktioniert einfach wieder. Ich kann nicht herausfinden warum, aber es wurde behoben.

Wenn Sie Änderungen haben, versuchen Sie, den ~/.ansibleOrdner zu säubern, bevor Sie Ihren Vagrant aktualisieren.

yikaus
quelle
3
rm -rf ~/.ansiblehat bei El Captitan
Quanlong
8
rm -rf ~ / .ansible / cp ist genug
melihovv
20

Fü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.

Sebastien DA ROCHA
quelle
yup, das war es!
Saurabh Nanda
Ich habe mich anfangs um das Problem gekümmert, indem ich auf gesetzt habe gather_facts, Falseaber dieser Tipp hat mir wirklich den Tag gerettet, denn das war auch mein Problem.
Karamol
18

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":

Warning: the ECDSA host key for 'myhost' differs from the key for the IP address '10.10.1.10'
Offending key for IP in /etc/ssh/ssh_known_hosts:246
Matching host key in /etc/ssh/ssh_known_hosts:477
Are you sure you want to continue connecting (yes/no)?

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:

  • Der private Schlüssel ist am Ziel möglicherweise nicht ordnungsgemäß eingerichtet
  • Privater Schlüssel verfügt möglicherweise lokal über falsche Berechtigungen (sollte nur für den Benutzer lesbar sein, der den Ansible-Job ausführt)

Lösung: Versuchen Sie, ansible -m ping <destination> -kgegen 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 setupModul kann (wenn es zu Beginn eines Laufs automatisch ansible-playbookausgeführt wird oder wenn es manuell ausgeführt wird als ansible -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:

gather_subset=!hardware
Jordan Anderson
quelle
1
Die Übergabe an 'gather_subset =! Hardware' zur Einrichtung funktionierte für eine bestimmte VM, die nicht reagierte.
JamesP
2
Für mich behoben. Dodgy Mount Points, denke ich. Ich hatte eine VM, die ich für eine zuverlässige Bereitstellung verwendete, und sie funktionierte, bis ich eine neue NFS-Freigabe hinzufügte. Jetzt tut es das nicht, bis ich das oben Gesagte hinzufügte.
David Boshton
In meinem Fall stellte sich heraus, dass es sich um ein Problem mit dem Hostschlüssel handelte. Der Host wurde neu abgebildet, sodass mein erster Durchlauf fehlschlug und ich den vorgeschlagenen ssh-keygen -RBefehl 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 die Warning: Permanently added the ECDSA host key ...Nachricht und nur das Sammeln von Fakten wurde fortgesetzt.
Haridsv
Ich kann die Beobachtung von @DavidBoshton bestätigen. Hatte dieses Problem auf einer VM, auf der NFS-Verzeichnisse bereitgestellt waren, die nicht verfügbar waren (NFS-Serverproblem). Nach dem
Reparieren
7

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.

/usr/bin/python /tmp/ansible_Jfv4PA/ansible_module_setup.py
/usr/bin/python /tmp/ansible_M2T10L/ansible_module_setup.py

Sobald ich diese getötet hatte, fing es wieder an zu funktionieren.

Tim Moses
quelle
5

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:

ansible -m ping <hostname>

Dieser Test stellt nur eine Verbindung zum Host her und führt ausreichend Code aus, um Folgendes zurückzugeben:

<hostname> | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

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 -KSchalter 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:

# Delete all the current sockets (may disrupt currently running playbooks)
rm -r ~/.ansible/cp
# Delete only the affected socket (requires to know which one it is)
rm ~/.ansible/cp/<replace-by-your-socket>

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:

  • Starte Playbooks von einem Server (mit einer Netzwerkverbindung, die stabiler ist als die deines Laptops)
  • Verwenden Sie eine anonyme Konfiguration oder direkt die ssh-Client-Konfiguration , um die Verbindungsfreigabe zu deaktivieren
  • Verwenden Sie dieselben Ressourcen, aber zum Optimieren von Zeitüberschreitungen, sodass bei einem Absturz der Master-Verbindung das Zeitlimit schneller abläuft

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:

ansible -m setup <hostname>

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:

ansible -m setup -a gather_subset='!all' <hostname>

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:

  • Beschränken Sie das Sammeln von Fakten auf eine Teilmenge, mit Ausnahme dessen, was Sie nicht benötigen (siehe mögliche Werte für 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:

  • Verwenden Sie eine maximale Ausführlichkeitsstufe ( -vvvv), da sie Ihnen jeden ausgeführten Befehl anzeigt
  • Verwenden Sie pingund setupModule direkt über die Befehlszeile, wie oben erläutert
  • Versuchen Sie, manuell zu ssh, wenn ansible -m pingdies nicht funktioniert
toadjaune
quelle
4

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/hostsAnsible 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/hostsDies ist die Standardeinstellung für die meisten, wenn nicht alle Linux-Systeme, aber auch für Ihre Bearbeitung /etc/nsswitch.confkann dies ein Problem sein.

user56781
quelle
2

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.

$ ssh-keygen -f "~/.ssh/known_hosts" -R <hostname>
$ ssh-keygen -f "~/.ssh/known_hosts" -R <ip_address>

Hinweis: Sie müssen sowohl den Hostnamen als auch die IP-Adresse entfernen

rleon
quelle
In meinem Fall habe ich eine IP-Adresse erneut verwendet. Daher waren zwei Hostschlüssel in der Datei known_hosts vorhanden
Karthik,
1

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.

Rcynic
quelle
1

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.

Schröffu
quelle
1

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.

ansible-playbook  -K -i hosts playbook.yml -vvvv
0x3bfc
quelle
0

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!

Dmytro Ozarkiv
quelle
0

Ich habe dieses Problem gelöst, indem ich die Vagabund-Box zurückgesetzt habe

vagrant destroy
vagrant up
Quanlong
quelle
0

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 -ler 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 -lsollte nicht hängen bleiben).

Vasco
quelle
0

~/.ansibleAlleine 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 fortgesetzt fg. In diesem Fall habe ich nichts gelöscht. aber danach ging es einfach weiter. Also habe ich einfach die Strg-Z-> fgalleine ausprobiert und es hat auch geklappt . Fühlt sich an wie Regentanz, aber wenn jemand anderes feststeckt, versuchen Sie das bitte auch.

erikbwork
quelle
0

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:

  1. Festlegen DEFAULT_KEEP_REMOTE_FILES=yes, dass die Befehle beibehalten und aktiviert werden-vvvv

  2. Führen Sie das Playbook erneut aus.

  3. Wenn das Spiel hängen bleibt, kopiere den zuletzt gedruckten Shell-Befehl (den Teil danach /bin/sh -c)

  4. Melden Sie sich am Server über an ssh.

  5. Verwenden Sie stracediese Taste, um den letzten Schritt des Spiels erneut abzuspielen. Der Schrittbefehl wird aus der -vvvAusgabe 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"

  6. Überprüfe, bei welchem ​​Aufruf der "gespannte" Schritt hängen geblieben ist und behebe es :)

In meinem Fall war es ein unzugängliches Netzlaufwerk ...

Yuri
quelle
-1

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.

witkacy26
quelle
1
Marionette? Welche Marionette? Dies ist eine vernünftige Frage.
Deer Hunter
Ja, ich weiß. Einige Leute haben vielleicht eine Marionette auf der gleichen Maschine installiert, auf der Ansible verwendet wird (dies war tatsächlich einmal mein Fall)
witkacy26