Ansible bloccato sulla raccolta di fatti


53

Sto riscontrando alcuni strani problemi con la mia casella di risposta (vagabondo).

Tutto ha funzionato ieri e il mio playbook ha funzionato bene.

Oggi Ansible si blocca sulla "raccolta di fatti"?

Ecco l'output dettagliato:

<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'"]

1
Si blocca per quanto tempo? Hai provato a vagrant sshindagare durante il blocco per vedere se c'è qualcosa di utile in pse netstat? Inoltre, uno dei primi sospetti negli hang è il DNS: controlla se il DNS si sta risolvendo dall'interno della macchina virtuale.
Antonis Christofides,

1
Grazie per il tuo commento. La soluzione era semplice, il vagabondo distruggere e il vagabondo ... Continuo a pensare che sia strano che abbia smesso di funzionare?
Bj Blazkowicz,

1
Ho avuto un problema con Ansible che si bloccava in caso di montaggi inaccessibili (cifs-).
rektide,

1
Appena accaduto, è stato causato da una chiave host obsoleta nel file known_hosts. Strano che la connessione non sia fallita come al solito in questo caso.
GnP,

Puoi controllare i registri sshd nella casella del vagabondo? Potrebbe essere necessario impostare "LogLevel DEBUG" in / etc / ssh / sshd_config, ma ciò potrebbe fornire maggiori informazioni su ciò che sta succedendo.
Pablo Martinez,

Risposte:


31

Stavo avendo un problema simile con Ansible ping su Vagrant, si è bloccato improvvisamente senza motivo e in precedenza ha funzionato perfettamente. A differenza di qualsiasi altro problema come ssh o connettivo, muore per sempre senza timeout.

Una cosa che ho fatto per risolvere questo problema è pulire la ~/.ansibledirectory e funziona di nuovo. Non riesco a scoprire perché, ma è stato risolto.

Se hai ricevuto delle modifiche per riprovare, prova a pulire la ~/.ansiblecartella prima di aggiornare Vagrant.


3
rm -rf ~/.ansiblenon ha funzionato per me su El Captitan
Quanlong il

8
rm -rf ~ / .ansible / cp è abbastanza
melihovv

Vedere la risposta di seguito da @toadjaune per il motivo per cui funziona.
Luke Stewart

20

Per me il modulo del modulo di installazione era bloccato su un supporto NFS morto.

Se fai un "df" sul tuo computer e non succede nulla, potresti essere sullo stesso caso.

PS: se non riesci a smontare la condivisione / mountpoint NFS, considera l'uso del "umount -l"


sì, era quello!
Saurabh Nanda,

Inizialmente ho risolto il problema impostando gather_factssu Falsema questo suggerimento ha davvero salvato la giornata perché anche questo era il mio problema.
pkaramol,

18

Ansible può bloccarsi in questo modo per una serie di motivi, di solito a causa di un problema di connessione o perché il modulo di installazione si blocca. Ecco come restringere il problema in modo da poterlo risolvere.

Ansible non può connettersi all'host di destinazione

Problemi relativi alla chiave host (known_hosts)

1) Nelle versioni precedenti di Ansible (2.1 o precedenti), Ansible non ti direbbe sempre se la chiave host per la destinazione non esiste sull'origine o se non c'è corrispondenza.

Soluzione: provare ad aprire una connessione SSH con gli stessi parametri a quella destinazione. Potresti trovare errori SSH che devi risolvere, quindi il comando funzionerà.

2) Talvolta Ansible visualizza un messaggio di connessione SSH nel mezzo di altri stati, causando il blocco di Ansible in quell'attività:

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 questo caso, semplicemente digitando "sì" per tutte le domande SSH che ti sono state poste, il gioco continuerà. Successivamente è possibile risolvere i problemi root known_hosts.

Problemi di autenticazione con chiave privata

Se si utilizza l'autenticazione basata su chiave vs password, altri problemi includono:

  • La chiave privata potrebbe non essere impostata correttamente sulla destinazione
  • La chiave privata potrebbe avere autorizzazioni errate localmente (dovrebbe essere leggibile solo dall'utente che esegue il processo Ansible)

Soluzione: prova a eseguire ansible -m ping <destination> -kl'host problematico: se ciò non funziona, prova le soluzioni precedenti relative ai problemi della chiave host .

Ansible non può raccogliere rapidamente fatti

Il setupmodulo (quando eseguito automaticamente all'inizio di una ansible-playbookcorsa o quando eseguito manualmente come ansible -m setup <host>) può spesso bloccarsi quando si raccolgono fatti hardware (ad esempio se si ottengono informazioni sul disco da host con I / O elevato, voci di montaggio errate, ecc.).

Soluzione: prova a correre ansible -m setup -a gather_subset=!all <destination>. Se funziona, dovresti considerare di impostare questa riga nel tuo ansible.cfg:

gather_subset=!hardware

1
Passare a 'gather_subset =! Hardware' per l'installazione ha funzionato per una particolare VM che non rispondeva.
JamesP,

2
Risolto per me. Dodgy mount points, penso. Avevo una macchina virtuale che ho usato per il provisioning rapido e ha funzionato fino a quando non ho aggiunto una nuova condivisione NFS. Ora no, fino a quando non ho aggiunto quanto sopra.
David Boshton,

Si è rivelato essere un problema chiave dell'host nel mio caso. L'host è stato reinventato, quindi la mia prima esecuzione non è riuscita e ho eseguito il ssh-keygen -Rcomando suggerito per rimuovere la chiave offensiva. Ho eseguito ssh una volta per ottenere la chiave aggiunta, ma la seconda corsa era sospesa. Quando ho eseguito di nuovo ssh, ho ricevuto la richiesta di conferma della chiave che era inaspettata. Mi sono reso conto che c'era una chiave offensiva che doveva essere rimossa, quindi dopo averlo rimosso e rieseguito ssh, ho ricevuto il Warning: Permanently added the ECDSA host key ...messaggio e poi è proseguita solo la raccolta dei fatti.
Haridsv,

Posso confermare l'osservazione di @DavidBoshton. Aveva questo problema su una macchina virtuale su cui erano montate le directory NFS, che non erano disponibili (problema del server NFS). Dopo aver corretto il server NFS ha funzionato
tschale

7

Ho avuto un problema simile con Ansible appeso a Gathering Facts. Ho ridotto il mio copione a un prompt senza compiti o ruoli ed è rimasto bloccato.

Ho trovato 12 processi sospesi nel mio elenco di processi che si erano accumulati nel corso della giornata.

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

Una volta che ho ucciso quelli, ha iniziato a funzionare di nuovo.


6

Ci sono molte ragioni per cui ansible può essere appeso alla riunione dei fatti, ma prima di andare oltre, ecco il primo test che dovresti fare in una tale situazione:

ansible -m ping <hostname>

Questo test si collega all'host ed esegue il codice sufficiente per restituire:

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

Se funziona, puoi praticamente escludere qualsiasi problema di installazione o connettività, poiché dimostra che potresti risolvere il nome host di destinazione, aprire una connessione, autenticare ed eseguire un modulo sensibile con l'interprete Python remoto.

Ora, ecco un elenco (non esaustivo) di cose che possono andare storte all'inizio di un playbook:

Il comando eseguito da ansible è in attesa di un input interattivo

Ricordo che ciò accadeva nelle versioni precedenti di Ansible, in cui un comando avrebbe atteso un input interattivo che non sarebbe mai arrivato, come una password sudo (quando si è dimenticato un -Kinterruttore) o l'accettazione di una nuova impronta digitale dell'host ssh (per una nuova destinazione ospite).

Le versioni moderne di ansible gestiscono entrambi questi casi con garbo e generano immediatamente un errore per le normali modalità d'uso, quindi a meno che tu non stia facendo cose come chiamare ssh o sudo te stesso, non dovresti avere questo tipo di problema. E anche se lo facessi, sarebbe dopo la raccolta dei fatti.

Connessione master SSH morta

Ci sono alcune opzioni molto interessanti passate al client ssh, nel registro di debug fornito qui:

  • ControlMaster=auto
  • ControlPersist=60s
  • ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r

Queste opzioni sono documentate in man ssh_config .

Per impostazione predefinita, ansible cercherà di essere intelligente per quanto riguarda l'uso della sua connessione ssh. Per un determinato host, invece di creare una nuova connessione per ogni singola attività del gioco, la aprirà una volta e la manterrà aperta per l'intero playbook (e persino attraverso i playbook).

Va bene, poiché stabilire una nuova connessione è molto più lento e richiede molto tempo rispetto all'utilizzo di una già esistente.

In pratica, ogni connessione ssh verificherà l'esistenza di un socket su ~/.ansible/cp/some-host-specific-path. La prima connessione non riesce a trovarla, quindi si connette normalmente e quindi la crea. Ogni connessione successiva utilizzerà quindi questo socket per passare attraverso la connessione già stabilita.

Anche se la connessione stabilita alla fine si interrompe e si chiude dopo non essere stata utilizzata per un tempo sufficiente, anche il socket viene chiuso e torniamo al punto di partenza.

Fin qui tutto bene.

A volte, tuttavia, la connessione in realtà muore, ma il client ssh la considera ancora stabilita. Ciò si verifica in genere quando si esegue il playbook dal proprio laptop e si perde la connessione WiFi (o si passa da WiFi a Ethernet, ecc ...)

Quest'ultimo esempio è una situazione terribile: puoi inviare ssh al computer di destinazione con una configurazione ssh predefinita, ma fintanto che la tua connessione precedente sarà ancora considerata attiva, Ansible non proverà nemmeno a stabilirne una nuova.

A questo punto, vogliamo solo sbarazzarci di questo vecchio socket e il modo più semplice per farlo è rimuoverlo:

# 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>

Questo è perfetto per una correzione one-shot, ma se succede troppo spesso, potrebbe essere necessario cercare una correzione a lungo termine. Ecco alcuni suggerimenti che potrebbero aiutare a raggiungere questo obiettivo:

  • Avvia i playbook da un server (con una connessione di rete molto più stabile di quella del tuo laptop)
  • Utilizzare la configurazione ansible o direttamente la configurazione client ssh per disabilitare la condivisione della connessione
  • Utilizzare le stesse risorse, ma per ottimizzare i timeout, in modo che un arresto anomalo della connessione principale scada effettivamente più rapidamente

Si prega di notare che al momento della stesura di questo documento, alcune opzioni sono cambiate (ad esempio, la mia ultima esecuzione mi ha dato ControlPath=/home/toadjaune/.ansible/cp/871b533295), ma l'idea generale è ancora valida.

La raccolta dei fatti in realtà richiede troppo tempo

All'inizio di ogni gioco, Ansible raccoglie molte informazioni sul sistema di destinazione e le mette in fatti . Queste sono variabili che puoi quindi utilizzare nel tuo playbook e di solito sono davvero utili, ma a volte ottenere queste informazioni può essere molto lungo (punti di montaggio errati, dischi con I / O elevato, carico elevato ...)

Detto questo, non è strettamente necessario fatti per eseguire un playbook, e quasi certamente non tutti, quindi proviamo e quello che disabilita non abbiamo bisogno. Diverse opzioni per quello:

Ai fini del debug, è davvero utile richiamare il modulo di installazione direttamente dalla riga di comando:

ansible -m setup <hostname>

Quest'ultimo comando dovrebbe bloccarsi così come il tuo playbook ed eventualmente timeout (o esito positivo). Ora eseguiamo di nuovo il modulo, disabilitando tutto ciò che possiamo:

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

Se questo si blocca ancora, puoi sempre provare a disabilitare totalmente il modulo nel tuo gioco, ma è molto probabile che il tuo problema sia altrove.

Se, tuttavia, funziona correttamente (e rapidamente), dai un'occhiata alla documentazione del modulo . Hai due opzioni:

  • Limitare la raccolta dei fatti a un sottoinsieme, escludendo ciò che non è necessario (vedere i valori possibili per gather_subset)
  • gather_timeout può anche aiutarti a risolvere il problema, concedendo più tempo (anche se ciò significherebbe correggere un errore di timeout, non un blocco)

Altri problemi

Ovviamente, altre cose possono andare storte. Alcuni suggerimenti per aiutare il debug:

  • Usa il livello di verbosità massimo ansible ( -vvvv), poiché ti mostrerà ogni comando eseguito
  • Utilizzare pinge setupmoduli direttamente dalla riga di comando come spiegato sopra
  • Prova a ssh manualmente se ansible -m pingnon funziona

+1 per la spiegazione del perché cancellare le opere ~ / .ansible (in risposta da @yikaus)
Luke Stewart

4

Dmytro è su qualcosa!

Ansible utilizza il nome FQDN dell'host. Se il tuo host non è risolvibile da DNS e non hai una mappatura in /etc/hostsattesa, il DNS si spegnerà.

Aggiungendo ::1 <fqdn>il file host delle macchine che si stanno connettendo Ansible otterrà immediatamente il nome di dominio completo senza passare attraverso il DNS.

Nota che l'host dovrebbe cercare host da /etc/hosts, questo è il valore predefinito per la maggior parte, se non per tutti, i sistemi linux, ma se anche la tua modifica /etc/nsswitch.confpotrebbe essere un problema.


2

Ho avuto lo stesso problema. Non ho ottenuto informazioni utili eseguendo ansible in modalità dettagliata.

È stato eseguito il provisioning del server prima di eseguire il playbook.

La rimozione del server dall'elenco host noto ha risolto il problema utilizzando il comando seguente.

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

Nota: è necessario rimuovere sia il nome host che l'indirizzo IP


Nel mio caso ho riutilizzato un indirizzo IP. Quindi due chiavi host erano presenti nel file known_hosts
Karthik il

1

Non so se stai usando un playbook sudo - ma lo ero, ed era appeso alla password sudo.

Dalla documentazione: puoi ucciderlo e poi anche usarlo -K.

In bocca al lupo.


1

Forse l'impronta digitale del sistema di destinazione è cambiata, ad esempio quando si reinstalla il sistema operativo del server. Devi eliminare le voci in known_hosts , ansible non notificherà che una voce non attendibile è il problema, si blocca esattamente come descritto.


1

Sembra che ansible non sia in grado di autenticare ... quindi usa -k per consentire a ansible di chiedere la password del server .... come mostrato di seguito:

ansible-playbook  -K -i hosts playbook.yml -vvvv

0

La mancata corrispondenza del nome FQDN e del nome host può anche causare un hangout sensibile. Ho usato FQDN con dominio diverso dal dominio hostname. Dopo aver reso entrambi uguali , Ansible funziona perfettamente. Probabilmente risponde confronta FQDN e nome host prima di eseguire attività sull'host remoto. Spero che sia d'aiuto!


0

Ho risolto questo problema reimpostando la scatola del vagabondo

vagrant destroy
vagrant up

0

Nel mio caso Ansible ha smesso di funzionare nel mezzo di un'attività. Il motivo era perché il mio agente ssh ha smesso di funzionare ( ssh-add -lnon restituiva nulla). Ho riavviato tutto e ha funzionato di nuovo. Quindi controlla se il tuo agente ssh funziona correttamente ( ssh-add -lnon dovrebbe rimanere bloccato).


0

L'eliminazione da ~/.ansiblesola non l'ha fatto per me. Quindi per controllare cosa c'è in quella directory ho appena fatto un ctrl-z (mettere il processo in sospensione) e controllato, e poi ho continuato il processo di risposta fg. Non ho cancellato nulla in quel caso. ma dopo ha continuato. Quindi ho solo provato ctrl-z-> fgda solo e ha funzionato. Ti senti come il ballo della pioggia, ma se qualcun altro è bloccato, per favore prova anche quello.


0

Ho risolto la causa di questo problema seguendo i consigli di Perché il mio ansible-playbook si blocca in "Raccolta dei fatti"? post sul blog.

Può essere semplificato per:

  1. Impostare DEFAULT_KEEP_REMOTE_FILES=yesper conservare i comandi e abilitare-vvvv

  2. Esegui nuovamente il playbook.

  3. Quando il gioco si blocca, copia l'ultimo comando shell stampato (la parte successiva /bin/sh -c)

  4. Accedere al server tramite ssh.

  5. Utilizzare straceper riprodurre l'ultimo passaggio della riproduzione. Il comando step viene copiato -vvvdall'output. Per esempio:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"

  6. Controlla su quale chiamata è bloccato il passaggio "stracciato" e correggilo :)

Nel mio caso era un'unità di rete inaccessibile ...


-1

La password di Sudo è il problema. Assicurarsi che (1) è possibile emettere 'sudo nulla ' sul recente apertura terminale (dove password a non memorizzata nella cache) senza fornire una (2) che fantoccio non ha invertito i cambiamenti tuoi 'sudoers' in precedenza manuali.


1
Fantoccio? Quale burattino? Questa è una domanda.
Deer Hunter,

Si, lo so. Alcune persone potrebbero aver installato delle marionette sulla stessa macchina in cui viene utilizzato
Ansible
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.