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'"]
vagrant ssh
investigar durante el bloqueo para ver si hay algo útil enps
ynetstat
? 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.Respuestas:
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
~/.ansible
directorio y simplemente funciona de nuevo. No puedo averiguar por qué, pero se resolvió.Si tiene un cambio para tenerlo nuevamente, intente limpiar la
~/.ansible
carpeta antes de actualizar su Vagrant.fuente
rm -rf ~/.ansible
no funcionó para mí en ElPara 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
fuente
gather_facts
deFalse
pero este consejo realmente salvó el día, porque ese era mi problema también.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:
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:
Solución: intente ejecutar
ansible -m ping <destination> -k
el host del problema; si eso no funciona, pruebe las soluciones de Host Key Problems anteriores.Ansible no puede recopilar datos rápidamente
El
setup
módulo (cuando se ejecuta automáticamente al comienzo de unaansible-playbook
ejecución, o cuando se ejecuta manualmente comoansible -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:fuente
ssh-keygen -R
comando 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í elWarning: Permanently added the ECDSA host key ...
mensaje y luego solo continuó la recopilación de datos.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.
Una vez que los maté, comenzó a funcionar nuevamente.
fuente
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:
Esta prueba solo se conecta al host y ejecuta suficiente código para devolver:
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
-K
interruptor) 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:
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:
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:
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:
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:
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:
-vvvv
), ya que le mostrará todos los comandos ejecutadosping
ysetup
módulos directamente desde la línea de comandos como se explicó anteriormenteansible -m ping
no funcionafuente
¡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/hosts
ansible, 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.conf
también puede ser un problema.fuente
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.
Nota: debe eliminar tanto el nombre de host como la dirección IP
fuente
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
-K
también.Buena suerte.
fuente
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.
fuente
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:
fuente
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!
fuente
Resolví este problema restableciendo el cuadro vagabundo
fuente
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 -l
no devolvía nada). Reinicié todo y funcionó de nuevo. Por lo tanto, compruebe si su agente ssh funciona correctamente (ssh-add -l
no debe bloquearse).fuente
Eliminar
~/.ansible
solo 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 defg
. No eliminé nada en ese caso. pero después de eso solo continuó. Así que probé solo ctrl-z->fg
y también funcionó. Se siente como el baile de la lluvia, pero si alguien más está atrapado, por favor, inténtalo.fuente
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:
Establecer
DEFAULT_KEEP_REMOTE_FILES=yes
para preservar los comandos y habilitar-vvvv
Ejecute el libro de jugadas nuevamente.
Cuando el juego se pega, copie el último comando de shell impreso (la parte posterior
/bin/sh -c
)Inicie sesión en el servidor a través de
ssh
.Úselo
strace
para reproducir el último paso de la obra. El comando de paso se copia de la-vvv
salida. 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"
Comprueba en qué llamada se atascó el paso "estratificado" y arréglalo :)
En mi caso, era una unidad de red inaccesible ...
fuente
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'.
fuente