Ansible atrapado en la recopilación de datos

53

Tengo algunos problemas extraños con mi cuadro ansible (vagabundo).

Todo funcionó ayer y mi libro de jugadas funcionó bien.

¿Hoy, ansible depende de "reunir datos"?

Aquí está la salida detallada:

<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
fuente
1
¿Se cuelga por cuánto tiempo? ¿Intentaste vagrant sshinvestigar durante el bloqueo para ver si hay algo útil en psy netstat? Además, uno de los primeros sospechosos en hangs es DNS: compruebe si DNS se está resolviendo desde el interior de la máquina virtual.
Antonis Christofides
1
Gracias por tu comentario. La solución fue simple, vagabundo destruir y vagabundo ... Todavía creo que es extraño que simplemente dejó de funcionar?
Bj Blazkowicz
1
Tuve un problema con el bloqueo de Ansible si hay monturas inaccesibles (cifs-).
Rektide
1
Acaba de ocurrir, fue causado por una clave de host desactualizada en el archivo known_hosts Es extraño que la conexión no haya fallado, como es habitual en este caso.
GnP
¿Puedes revisar los registros sshd en el cuadro vagabundo? Es posible que deba configurar "LogLevel DEBUG" en / etc / ssh / sshd_config, pero eso puede proporcionar más información sobre lo que está sucediendo.
Pablo Martinez

Respuestas:

31

Estaba teniendo un problema similar con Ansible ping en Vagrant, de repente se atascó sin razón y anteriormente funcionó absolutamente bien. A diferencia de cualquier otro problema como ssh o problema de conexión, simplemente muere para siempre sin tiempo de espera.

Una cosa que hice para resolver este problema es limpiar el ~/.ansibledirectorio y simplemente funciona de nuevo. No puedo averiguar por qué, pero se resolvió.

Si tiene un cambio para tenerlo nuevamente, intente limpiar la ~/.ansiblecarpeta antes de actualizar su Vagrant.

yikaus
fuente
3
rm -rf ~/.ansibleno funcionó para mí en El
Captitan
8
rm -rf ~ / .ansible / cp es suficiente
melihovv
Vea la respuesta a continuación de @toadjaune para saber por qué esto funciona.
Luke Stewart
20

Para mí, el módulo del módulo de configuración estaba atascado en un montaje NFS muerto.

Si hace un "df" en su máquina y no sucede nada, puede estar en el mismo caso.

PD: si no puede desmontar el recurso compartido / punto de montaje NFS, considere usar el "umount -l" incorrecto

Sebastien DA ROCHA
fuente
sí, eso fue todo!
Saurabh Nanda
Tengo en torno al tema inicialmente mediante el establecimiento gather_factsde Falsepero este consejo realmente salvó el día, porque ese era mi problema también.
pkaramol
18

Ansible puede bloquearse así por varias razones, generalmente debido a un problema de conexión o porque el módulo de configuración se bloquea. Aquí se explica cómo reducir el problema para que pueda resolverlo.

Ansible no puede conectarse al host de destino

Problemas con la clave de host (hosts_host)

1) En versiones anteriores de Ansible (2.1 o anteriores), Ansible no siempre le dirá si la clave de host para el destino no existe en la fuente, o si hay una falta de coincidencia.

Solución: intente abrir una conexión SSH con los mismos parámetros a ese destino. Puede encontrar errores SSH que necesita resolver, y luego el comando funcionará.

2) En ocasiones, Ansible le muestra un mensaje de conexión SSH en medio de otros estados, lo que hace que Ansible se "congele" en esa tarea:

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)?

En este caso, simplemente escribiendo "sí" para tantas preguntas SSH como se le haya pedido permitirá que la jugada continúe. Luego, puede solucionar los problemas de raíz conocido_hosts.

Problemas de autenticación de clave privada

Si utiliza la autenticación basada en clave frente a la contraseña, otros problemas incluyen:

  • La clave privada puede no estar configurada correctamente en el destino
  • La clave privada puede tener permisos locales incorrectos (debe ser legible solo por el usuario que ejecuta el trabajo Ansible)

Solución: intente ejecutar ansible -m ping <destination> -kel host del problema; si eso no funciona, pruebe las soluciones de Host Key Problems anteriores.

Ansible no puede recopilar datos rápidamente

El setupmódulo (cuando se ejecuta automáticamente al comienzo de una ansible-playbookejecución, o cuando se ejecuta manualmente como ansible -m setup <host>) a menudo puede colgarse al recopilar datos de hardware (por ejemplo, si obtiene información del disco de hosts con alta E / S, entradas de montaje incorrectas, etc.).

Solución: intente correr ansible -m setup -a gather_subset=!all <destination>. Si esto funciona, debería considerar configurar esta línea en su ansible.cfg:

gather_subset=!hardware
Jordan Anderson
fuente
1
Pasar a 'recolectar_subset =! Hardware' para configurar funcionó para una máquina virtual en particular que no respondía.
JamesP
2
Arreglado para mí Puntos de montaje esquivos, creo. Tenía una VM que utilicé para el aprovisionamiento ansible y funcionó hasta que agregué un nuevo recurso compartido NFS. Ahora no, hasta que agregué lo anterior.
David Boshton el
Resultó ser un problema clave de host en mi caso. El host fue reimpreso, por lo que mi primera ejecución falló y ejecuté el ssh-keygen -Rcomando sugerido para eliminar la clave ofensiva. Ejecuté ssh una vez para obtener la clave agregada, pero la segunda ejecución estaba colgando. Cuando volví a ejecutar ssh, recibí el mensaje de confirmación de clave que era inesperado. Me di cuenta de que había una clave ofensiva que debía eliminarse, así que después de eliminarla y volver a ejecutar ssh, recibí el Warning: Permanently added the ECDSA host key ...mensaje y luego solo continuó la recopilación de datos.
haridsv
Puedo confirmar la observación de @DavidBoshton. Tenía este problema en una máquina virtual que tenía los directorios NFS montados, que no estaban disponibles (problema del servidor NFS). Después de arreglar el servidor NFS funcionó
tschale
7

Tuve un problema similar con Ansible colgando en Gathering Facts. Disminuí mi script a un indicador sin tareas ni roles y todavía se colgó.

Encontré 12 procesos ansibles colgados en mi lista de procesos que se habían acumulado durante el día.

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

Una vez que los maté, comenzó a funcionar nuevamente.

Tim Moisés
fuente
6

Hay muchas razones por las cuales ansible puede colgar en la recopilación de datos, pero antes de continuar, aquí está la primera prueba que debe hacer en cualquier situación:

ansible -m ping <hostname>

Esta prueba solo se conecta al host y ejecuta suficiente código para devolver:

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

Si esto funciona, puede descartar cualquier problema de configuración o conectividad, ya que demuestra que puede resolver el nombre de host de destino, abrir una conexión, autenticar y ejecutar un módulo ansible con el intérprete de Python remoto.

Ahora, aquí hay una lista (no exhaustiva) de cosas que pueden salir mal al comienzo de un libro de jugadas:

El comando ejecutado por ansible está esperando una entrada interactiva

Puedo recordar que esto sucedió en versiones anteriores de ansible, donde un comando esperaría una entrada interactiva que nunca llegaría, como una contraseña de sudo (cuando olvidó un -Kinterruptor) o la aceptación de una nueva huella digital de host ssh (para un nuevo objetivo anfitrión).

Las versiones modernas de ansible manejan ambos casos con gracia y generan un error de inmediato para los casos de uso normales, por lo que a menos que esté haciendo cosas como llamar a ssh o sudo usted mismo, no debería tener este tipo de problema. E incluso si lo hicieras, sería después de reunir los hechos.

Conexión maestra ssh muerta

Hay algunas opciones muy interesantes que se pasan al cliente ssh, en el registro de depuración que se proporciona aquí:

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

Estas opciones están documentadas en man ssh_config .

Por defecto, ansible intentará ser inteligente con respecto al uso de su conexión ssh. Para un host determinado, en lugar de crear una nueva conexión para todas y cada una de las tareas de la obra, la abrirá una vez y la mantendrá abierta para todo el libro de jugadas (e incluso para los libros de jugadas).

Eso es bueno, ya que establecer una nueva conexión es mucho más lento e intensivo en cómputo que usar una ya existente.

En la práctica, cada conexión ssh verificará la existencia de un socket en ~/.ansible/cp/some-host-specific-path. La primera conexión no puede encontrarlo, por lo que se conecta normalmente y luego lo crea. Cada conexión subsiguiente utilizará este socket para pasar por la conexión ya establecida.

Incluso si la conexión establecida finalmente agota el tiempo de espera y se cierra después de no usarse durante el tiempo suficiente, el zócalo también se cierra y volvemos al punto de partida.

Hasta aquí todo bien.

Sin embargo, a veces, la conexión en realidad muere, pero el cliente ssh aún la considera establecida. Esto generalmente ocurre cuando ejecuta el libro de jugadas desde su computadora portátil y pierde su conexión WiFi (o cambia de WiFi a Ethernet, etc.)

Este último ejemplo es una situación terrible: puede enviar ssh a la máquina de destino con una configuración ssh predeterminada, pero mientras su conexión anterior todavía se considere activa, ansible ni siquiera intentará establecer una nueva.

En este punto, solo queremos deshacernos de este viejo socket, y la forma más sencilla de hacerlo es eliminarlo:

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

Esto es perfecto para una solución de una sola vez, pero si sucede con demasiada frecuencia, es posible que deba buscar una solución a más largo plazo. Aquí hay algunos consejos que pueden ayudar a alcanzar este objetivo:

  • Inicie playbooks desde un servidor (con una conexión de red mucho más estable que la de su computadora portátil)
  • Use la configuración ansible , o directamente la configuración del cliente ssh para deshabilitar la conexión compartida
  • Use los mismos recursos, pero para ajustar los tiempos de espera, de modo que un bloqueo de conexión maestra realmente agote el tiempo de espera más rápido

Tenga en cuenta que al momento de escribir, algunas opciones han cambiado (por ejemplo, mi última ejecución me dio ControlPath=/home/toadjaune/.ansible/cp/871b533295), pero la idea general sigue siendo válida.

La recopilación de datos realmente toma demasiado tiempo

Al comienzo de cada jugada, ansible recopila mucha información sobre el sistema objetivo y la pone en Hechos . Estas son variables que luego puede usar en su libro de jugadas, y generalmente son realmente útiles, pero a veces, obtener esta información puede ser muy largo (puntos de montaje defectuosos, discos con alta E / S, alta carga ...)

Dicho esto, no necesitas estrictamente hechos para ejecutar un libro de jugadas, y casi con certeza no todos, así que intentemos desactivar lo que no necesitamos. Varias opciones para eso:

Para fines de depuración, es realmente conveniente invocar el módulo de configuración directamente desde la línea de comandos:

ansible -m setup <hostname>

Este último comando debe colgar tan bien como su libro de jugadas y, finalmente, agotar el tiempo de espera (o tener éxito). Ahora, ejecutemos el módulo nuevamente, deshabilitando todo lo que podamos:

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

Si esto todavía se bloquea, siempre puede intentar deshabilitar totalmente el módulo en su juego, pero es muy probable que su problema esté en otro lugar.

Sin embargo, si funciona bien (y rápidamente), eche un vistazo a la documentación del módulo . Tienes dos opciones:

  • Limite la recopilación de datos a un subconjunto, excluyendo lo que no necesita (vea los valores posibles para gather_subset)
  • gather_timeout también puede ayudarlo a solucionar su problema, al permitirle más tiempo (aunque eso sería solucionar un error de tiempo de espera, no un bloqueo)

Otros asuntos

Obviamente, otras cosas pueden salir mal. Algunos consejos para ayudar a la depuración:

  • Use el nivel de verbosidad máximo ansible ( -vvvv), ya que le mostrará todos los comandos ejecutados
  • Use pingy setupmódulos directamente desde la línea de comandos como se explicó anteriormente
  • Intenta ssh manualmente si ansible -m pingno funciona
toadjaune
fuente
+1 para una explicación de por qué limpiar ~ / .ansible funciona (en respuesta de @yikaus)
Luke Stewart
4

¡Dmytro está haciendo algo!

Ansible usa el FQDN del host. Si su host no tiene resolución de DNS y no tiene una asignación en /etc/hostsansible, esperará a que el DNS agote el tiempo de espera.

Al agregar ::1 <fqdn>el archivo host de las máquinas que está conectando, Ansible obtendrá el FQDN inmediatamente sin pasar por DNS.

Tenga en cuenta que el host debe buscar hosts /etc/hosts, este es el valor predeterminado para la mayoría, si no todos, los sistemas Linux, pero si su edición /etc/nsswitch.conftambién puede ser un problema.

usuario56781
fuente
2

Tuve el mismo problema. No obtuve información útil al ejecutar ansible en modo detallado.

El servidor se reaprovisionó antes de ejecutar el libro de jugadas.

Eliminar el servidor de la lista de hosts conocidos solucionó esto usando el siguiente comando.

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

Nota: debe eliminar tanto el nombre de host como la dirección IP

rleon
fuente
En mi caso, reutilicé una dirección IP. Por lo tanto, dos claves de host estaban presentes en el archivo known_hosts
Karthik el
1

No sé si está utilizando un libro de jugadas de sudo, pero lo estaba, y estaba colgado en la contraseña de sudo.

De la documentación, puede eliminar eso y luego usarlo -Ktambién.

Buena suerte.

Rcynic
fuente
1

Tal vez la huella digital de su sistema de destino ha cambiado, por ejemplo, cuando reinstala el sistema operativo del servidor. Debe eliminar las entradas en conocido_hosts , ansible no notificará que una entrada no confiable es el problema, simplemente se atasca exactamente como usted describe.

Schroeffu
fuente
1

Parece que ansible no puede autenticarse ... así que use -k para permitir que ansible solicite la contraseña del servidor ... como se muestra a continuación:

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

El FQDN y la falta de coincidencia del nombre de host también pueden provocar un hangout ansible. He usado FQDN con dominio diferente del dominio de nombre de host. Después de hacer ambas cosas iguales , ansible funciona perfectamente. Posiblemente ansible compara FQDN y nombre de host antes de ejecutar tareas en el host remoto. ¡Espero eso ayude!

Dmytro Ozarkiv
fuente
0

Resolví este problema restableciendo el cuadro vagabundo

vagrant destroy
vagrant up
Quanlong
fuente
0

En mi caso, Ansible dejó de trabajar en medio de una tarea. La razón fue porque mi agente ssh dejó de funcionar ( ssh-add -lno devolvía nada). Reinicié todo y funcionó de nuevo. Por lo tanto, compruebe si su agente ssh funciona correctamente ( ssh-add -lno debe bloquearse).

Vasco
fuente
0

Eliminar ~/.ansiblesolo no lo hizo por mí. Entonces, para verificar qué hay en ese directorio, simplemente hice un ctrl-z (poner el proceso en suspensión) y lo verifiqué, y luego continué el proceso ansible a través de fg. No eliminé nada en ese caso. pero después de eso solo continuó. Así que probé solo ctrl-z-> fgy también funcionó. Se siente como el baile de la lluvia, pero si alguien más está atrapado, por favor, inténtalo.

erikbwork
fuente
0

He solucionado la causa de este problema siguiendo los consejos de ¿Por qué mi libro de jugadas ansible se cuelga en "Recopilación de datos"? entrada en el blog.

Se puede simplificar para:

  1. Establecer DEFAULT_KEEP_REMOTE_FILES=yespara preservar los comandos y habilitar-vvvv

  2. Ejecute el libro de jugadas nuevamente.

  3. Cuando el juego se pega, copie el último comando de shell impreso (la parte posterior /bin/sh -c)

  4. Inicie sesión en el servidor a través de ssh.

  5. Úselo stracepara reproducir el último paso de la obra. El comando de paso se copia de la -vvvsalida. Por ejemplo:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"

  6. Comprueba en qué llamada se atascó el paso "estratificado" y arréglalo :)

En mi caso, era una unidad de red inaccesible ...

Yuri
fuente
-1

La contraseña de Sudo es el problema. Asegúrese de que (1) pueda emitir 'sudo cualquier cosa ' en el terminal recién abierto (donde la contraseña no está en caché) sin proporcionar uno (2) que la marioneta no haya revertido sus cambios manuales anteriores de 'sudoers'.

witkacy26
fuente
1
¿Marioneta? Que marioneta Esta es una pregunta ansible.
Deer Hunter
Sí, lo sé. Algunas personas pueden tener títeres instalados en la misma máquina donde se usa ansible (este fue mi caso una vez)
witkacy26