web-dev-qa-db-fra.com

Ansible coincé sur la collecte des faits

J'ai des problèmes étranges avec ma boîte ansible (vagabonde).

Tout a fonctionné hier et mon livre de jeu a bien fonctionné.

Aujourd'hui, ansible s'accroche à "rassembler des faits"?

Voici la sortie détaillée:

<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'"]
55
Bj Blazkowicz

J'avais un problème similaire avec Ansible ping sur Vagrant, il s'est soudainement bloqué sans raison et a précédemment fonctionné très bien. Contrairement à tout autre problème comme ssh ou problème connectif, il meurt pour toujours sans délai.

Une chose que j'ai fait pour résoudre ce problème est de nettoyer ~/.ansible répertoire et cela fonctionne à nouveau. Je ne peux pas savoir pourquoi, mais cela a été résolu.

Si vous avez de la modification, essayez de nettoyer le ~/.ansible dossier avant de rafraîchir votre Vagrant.

34
yikaus

Pour moi, le module du module d'installation était coincé sur un support NFS mort.

Si vous faites un "df" sur votre machine et que rien ne se passe, vous êtes peut-être sur le même boîtier.

PS: si vous ne pouvez pas démonter le partage/point de montage NFS, pensez à utiliser le mauvais "umount -l"

24
Sebastien DA ROCHA

Ansible peut se bloquer comme ça pour un certain nombre de raisons, généralement en raison d'un problème de connexion ou parce que le module d'installation se bloque. Voici comment réduire le problème afin de pouvoir le résoudre.

Ansible ne peut pas se connecter à l'hôte de destination

Problèmes de clé d'hôte (known_hosts)

1) Sur les anciennes versions d'Ansible (2.1 ou antérieures), Ansible ne vous dirait pas toujours si la clé Host pour la destination n'existe pas sur la source, ou s'il y a une incompatibilité.

Solution: essayez d'ouvrir une connexion SSH avec les mêmes paramètres sur cette destination. Vous pouvez trouver des erreurs SSH que vous devez résoudre, puis la commande fonctionnera.

2) Parfois, Ansible vous affiche un message de connexion SSH au milieu d'autres états, ce qui provoque le blocage de Ansible sur cette tâche:

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

Dans ce cas, le simple fait de taper "oui" pour autant de questions SSH que l'on vous a demandé permettra au jeu de continuer. Ensuite, vous pouvez résoudre les problèmes racine connus des hôtes.

Problèmes d'authentification de clé privée

Si vous utilisez l'authentification par clé par rapport au mot de passe, d'autres problèmes incluent:

  • La clé privée n'est peut-être pas configurée correctement sur la destination
  • La clé privée peut avoir des autorisations incorrectes localement (ne doit être lisible que par l'utilisateur exécutant le travail Ansible)

Solution: essayez d'exécuter ansible -m ping <destination> -k contre le problème Host - si cela ne fonctionne pas, essayez les solutions Host Key Problems ci-dessus.

Ansible ne peut pas rassembler rapidement les faits

Le module setup (lorsqu'il est exécuté automatiquement au début d'un ansible-playbook exécuter, ou lorsqu'il est exécuté manuellement en tant que ansible -m setup <Host>) peut souvent se bloquer lors de la collecte d'informations sur le matériel (par exemple, si vous obtenez des informations sur le disque à partir d'hôtes avec des entrées/sorties élevées, de mauvaises entrées de montage, etc.).

Solution: essayez d'exécuter ansible -m setup -a gather_subset=!all <destination>. Si cela fonctionne, vous devriez envisager de définir cette ligne dans votre ansible.cfg:

gather_subset=!hardware
18
Jordan Anderson

Il y a plusieurs raisons pour lesquelles ansible peut se bloquer lors de la collecte des faits, mais avant d'aller plus loin, voici le premier test que vous devriez faire dans une telle situation:

ansible -m ping <hostname>

Ce test se connecte simplement à l'hôte et exécute suffisamment de code pour renvoyer:

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

Si cela fonctionne, vous pouvez à peu près exclure tout problème de configuration ou de connectivité, car cela prouve que vous pouvez résoudre le nom d'hôte cible, ouvrir une connexion, authentifier et exécuter un module ansible avec la télécommande python interprète.

Maintenant, voici une liste (non exhaustive) des choses qui peuvent mal tourner au début d'un playbook:

La commande exécutée par ansible attend une entrée interactive

Je me souviens de ce qui se passait sur les anciennes versions d'ansible, où une commande attendait une entrée interactive qui ne viendrait jamais, comme un mot de passe Sudo (lorsque vous avez oublié un -K switch), ou l'acceptation d'une nouvelle empreinte digitale de l'hôte ssh (pour un nouvel hôte cible).

Les versions modernes d'ansible gèrent ces deux cas avec élégance et génèrent immédiatement une erreur pour les cas d'utilisation normaux, donc à moins que vous ne fassiez vous-même des appels tels que ssh ou Sudo, vous ne devriez pas avoir ce genre de problème. Et même si vous le faisiez, ce serait après la collecte des faits.

Connexion maître ssh morte

Il y a quelques options très intéressantes passées au client ssh, dans le journal de débogage donné ici:

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

Ces options sont documentées dans man ssh_config .

Par défaut, ansible essaiera d'être intelligent en ce qui concerne l'utilisation de sa connexion ssh. Pour un hôte donné, au lieu de créer une nouvelle connexion pour chaque tâche du jeu, il l'ouvrira une fois et le gardera ouvert pour l'ensemble du livre de jeu (et même sur tous les livres de jeu).

C'est bien, car établir une nouvelle connexion est beaucoup plus lent et exigeant beaucoup de calculs que d'utiliser une connexion déjà existante.

En pratique, chaque connexion ssh vérifie l'existence d'une socket à ~/.ansible/cp/some-Host-specific-path. La première connexion ne peut pas la trouver, elle se connecte donc normalement, puis la crée. Chaque connexion suivante utilisera alors cette prise pour passer par la connexion déjà établie.

Même si la connexion établie expire finalement et se ferme après une période d'inutilisation insuffisante, la prise est également fermée et nous sommes de retour à la case départ.

Jusqu'ici tout va bien.

Parfois cependant, la connexion meurt réellement, mais le client ssh considère toujours qu'elle est établie. Cela se produit généralement lorsque vous exécutez le playbook à partir de votre ordinateur portable et que vous perdez votre connexion WiFi (ou passez du WiFi à Ethernet, etc.)

Ce dernier exemple est une situation terrible: vous pouvez ssh vers la machine cible avec une configuration ssh par défaut, mais tant que votre connexion précédente est toujours considérée comme active , ansible n'essaiera même pas d'en créer un nouveau.

À ce stade, nous voulons simplement nous débarrasser de cette ancienne socket, et la façon la plus simple de le faire est de la supprimer:

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

C'est parfait pour une solution unique, mais si cela se produit trop souvent, vous devrez peut-être rechercher une solution à plus long terme. Voici quelques conseils qui pourraient aider à atteindre cet objectif:

  • Démarrez les playbooks à partir d'un serveur (avec une connexion réseau bien plus stable que celle de votre ordinateur portable)
  • Utilisez configuration ansible , ou directement configuration client ssh pour désactiver le partage de connexion
  • Utilisez les mêmes ressources, mais pour affiner les délais d'attente, de sorte qu'une panne de connexion principale expire plus rapidement

Veuillez noter qu'au moment de la rédaction, quelques options ont changé (par exemple, ma dernière exécution m'a donné ControlPath=/home/toadjaune/.ansible/cp/871b533295), mais l'idée générale est toujours valable.

La collecte des faits prend en fait trop de temps

Au début de chaque jeu, ansible recueille beaucoup d'informations sur le système cible et les met dans Faits . Ce sont des variables que vous pouvez ensuite utiliser dans votre playbook, et sont généralement très pratiques, mais parfois, obtenir ces informations peut être très long (mauvais points de montage, disques avec un nombre d'E/S élevé, une charge élevée…)

Cela étant dit, vous n'avez pas strictement besoin de faits pour exécuter un playbook, et presque certainement pas tous, alors essayons de désactiver ce que nous don pas besoin. Plusieurs options pour cela:

À des fins de débogage, il est vraiment pratique d'appeler le module de configuration directement à partir de la ligne de commande:

ansible -m setup <hostname>

Cette dernière commande devrait se bloquer ainsi que votre playbook, et éventuellement expirer (ou réussir). Maintenant, exécutons à nouveau le module, désactivant tout ce que nous pouvons:

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

Si cela se bloque toujours, vous pouvez toujours essayer de désactiver totalement le module dans votre jeu, mais il est très probable que votre problème soit ailleurs.

Si, cependant, cela fonctionne bien (et rapidement), alors jetez un œil à la documentation du module . Vous avez deux options:

  • Limitez la collecte des faits à un sous-ensemble, à l'exclusion de ce dont vous n'avez pas besoin (voir les valeurs possibles pour gather_subset)
  • gather_timeout peut également vous aider à résoudre votre problème, en accordant plus de temps (bien que ce serait pour corriger une erreur de délai d'attente, pas un blocage)

Autres issues

De toute évidence, d'autres choses peuvent mal tourner. Quelques conseils pour aider au débogage:

  • Utiliser le niveau de verbosité maximum ansible (-vvvv), car il vous montrera chaque commande exécutée
  • Utilisez les modules ping et setup directement depuis la ligne de commande comme expliqué ci-dessus
  • Essayez de ssh manuellement si ansible -m ping ne fonctionne pas
9
toadjaune

J'ai eu un problème similaire avec Ansible suspendu à Gathering Facts. J'ai réduit mon script à une invite sans tâches ni rôles et il a toujours été bloqué.

J'ai trouvé 12 processus ansibles suspendus dans ma liste de processus qui s'étaient accumulés au cours de la journée.

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

Une fois que j'ai tué ceux-ci, cela a recommencé à fonctionner.

7
Tim Moses

Dmytro est sur quelque chose!

Ansible utilise le nom de domaine complet de l'hôte. Si votre hôte n'est pas résolu DNS et que vous n'avez pas de mappage dans /etc/hosts ansible attendra que le DNS expire.

En ajoutant ::1 <fqdn> dans le fichier Host des machines que vous connectez, Ansible obtiendra immédiatement le FQDN sans passer par DNS.

Notez que l'hôte doit rechercher des hôtes à partir de /etc/hosts, c'est la valeur par défaut pour la plupart des systèmes Linux, sinon tous, mais si votre édition /etc/nsswitch.conf cela pourrait aussi être un problème.

4
user56781

J'ai eu le même problème. Vous n'avez aucune information utile sur l'exécution de ansible en mode verbeux.

Le serveur a été réapprovisionné avant d'exécuter le playbook.

La suppression du serveur de la liste d'hôtes connue a résolu ce problème à l'aide de la commande ci-dessous.

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

Remarque: vous devez supprimer à la fois le nom d'hôte et l'adresse IP

2
rleon

Je ne sais pas si vous utilisez un playbook Sudo - mais je l'étais, et il était suspendu au mot de passe Sudo.

De la documentation - vous pouvez tuer cela, puis utiliser -K ainsi que.

Bonne chance.

1
Rcynic

Peut-être que l'empreinte digitale de votre système cible a changé, par exemple lorsque vous réinstallez le système d'exploitation du serveur. Vous devez supprimer les entrées dans known_hosts, ansible sera pas notifier qu'une entrée non fiable est le problème, elle se bloque exactement comme vous le décrivez.

1
Schroeffu

Il semble qu'ansible ne puisse pas s'authentifier ... utilisez donc -k pour laisser ansible demander le mot de passe du serveur .... comme indiqué ci-dessous:

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

Dans mon cas, ansible a cessé de travailler au milieu d'une tâche. La raison en était que mon agent ssh a cessé de fonctionner (ssh-add -l ne retournait rien). J'ai tout redémarré et cela a fonctionné à nouveau. Vérifiez donc si votre agent ssh fonctionne correctement (ssh-add -l ne doit pas rester bloqué).

0
Vasco

Suppression de ~/.ansible seul ne l'a pas fait pour moi. Donc, pour vérifier ce qu'il y a dans ce répertoire, j'ai juste fait un ctrl-z (mettre le processus en veille) et vérifié, puis j'ai continué le processus ansible via fg. Je n'ai rien supprimé dans ce cas. mais après ça a continué. J'ai donc essayé le ctrl-z -> fg seul et cela a aussi fonctionné. Se sent comme la danse de la pluie, mais si quelqu'un d'autre est coincé, essayez également cela.

0
erikbwork

incompatibilité du nom de domaine complet et du nom d'hôte peut également provoquer un hangout ansible. J'ai utilisé le FQDN avec un domaine différent du domaine du nom d'hôte. Après rendant les deux égaux, ansible fonctionne parfaitement. Il est possible que Ansible compare le nom de domaine complet et le nom d'hôte avant d'exécuter des tâches sur l'hôte distant. J'espère que cela aide!

0
Dmytro Ozarkiv

J'ai corrigé la cause de ce problème en suivant les conseils de Pourquoi mon ansible-playbook se bloque dans "Gathering facts"? blog.

Il peut être simplifié pour:

  1. Ensemble DEFAULT_KEEP_REMOTE_FILES=yes pour conserver les commandes et activer -vvvv

  2. Exécutez à nouveau le playbook.

  3. Lorsque le jeu se bloque, copiez la dernière commande Shell imprimée (la partie après /bin/sh -c)

  4. Connectez-vous au serveur via ssh.

  5. Utilisez strace pour rejouer la dernière étape de la lecture. La commande step est copiée à partir de -vvv production. Par exemple: strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"

  6. Vérifiez sur quel appel l'étape "straced" est bloquée et corrigez-la :)

Dans mon cas, c'était un lecteur réseau inaccessible ...

0
Yuri

J'ai résolu ce problème en réinitialisant la boîte vagabonde

vagrant destroy
vagrant up
0
Quanlong