J'ai quelques problèmes étranges avec ma boîte ansible (vagabond).
Tout a fonctionné hier et mon cahier a bien fonctionné.
Aujourd'hui, ansible dépend de "rassembler des faits"?
Voici la sortie commenté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'"]
vagrant ssh
enquêter pendant le blocage pour voir s’il y avait quelque chose d’utile dansps
etnetstat
? En outre, l'un des premiers suspects en attente est DNS - vérifiez si la résolution DNS est résolue depuis l'intérieur de la machine virtuelle.Réponses:
J'avais un problème similaire avec Ansible ping sur Vagrant, il est soudainement bloqué sans raison et a déjà fonctionné parfaitement. Contrairement à tout autre problème comme ssh ou un problème de connectivité, il meurt pour toujours sans délai.
Une chose que j'ai faite pour résoudre ce problème est de nettoyer le
~/.ansible
répertoire et cela fonctionne à nouveau. Je ne peux pas savoir pourquoi, mais le problème a été résolu.Si vous devez le modifier à nouveau, essayez de nettoyer le
~/.ansible
dossier avant d’actualiser votre Vagrant.la source
rm -rf ~/.ansible
n'a pas fonctionné pour moi sur El CaptitanPour moi, le module du module de configuration était bloqué sur un montage NFS mort.
Si vous faites un "df" sur votre machine et que rien ne se passe, vous serez peut-être dans le même cas.
PS: si vous ne pouvez pas démonter le partage / point de montage NFS, envisagez d’utiliser le mauvais "umount -l".
la source
gather_facts
sur,False
mais cette astuce a vraiment sauvé la journée parce que c'était aussi mon problème.Ansible peut se bloquer comme ceci pour plusieurs raisons, généralement à cause d'un problème de connexion ou du blocage du module de configuration. Voici comment réduire le problème pour le résoudre.
Ansible ne peut pas se connecter à l'hôte de destination
Problèmes de clé d'hôte (connus_hôtes)
1) Sur les anciennes versions d'Ansible (2.1 ou antérieures), Ansible ne vous dirait pas toujours si la clé de l'hôte pour la destination n'existe pas sur la source ou en cas de non concordance.
Solution: essayez d'ouvrir une connexion SSH avec les mêmes paramètres pour cette destination. Vous pouvez trouver les erreurs SSH que vous devez résoudre, puis la commande fonctionnera.
2) Parfois, Ansible affiche un message de connexion SSH pour vous au milieu d'autres états, ce qui provoque le "blocage" d'Ansible dans cette tâche:
Dans ce cas, il suffit de taper «oui» pour autant de questions SSH que l’on vous a demandé de poursuivre la partie. Ensuite, vous pouvez résoudre les problèmes connus de root_hosts.
Problèmes d'authentification par clé privée
Si vous utilisez une authentification à base de clé ou un mot de passe, les autres problèmes incluent:
Solution: essayez de vous lancer
ansible -m ping <destination> -k
contre l'hôte à problème. Si cela ne fonctionne pas, essayez les solutions de problèmes de clé d'hôte ci-dessus.Ansible ne peut pas rassembler rapidement les faits
Le
setup
module (lorsqu'il est exécuté automatiquement au début d'uneansible-playbook
exécution ou manuellementansible -m setup <host>
) peut se bloquer lors de la collecte d'informations matérielles (par exemple, en obtenant des informations sur le disque des hôtes avec une E / S élevée, des entrées de montage incorrectes, etc.).Solution: essayez de courir
ansible -m setup -a gather_subset=!all <destination>
. Si cela fonctionne, vous devriez envisager de définir cette ligne dans votre ansible.cfg:la source
ssh-keygen -R
commande suggérée pour supprimer la clé incriminée. J'ai exécuté ssh une fois pour obtenir la clé ajoutée, mais la deuxième exécution était en suspens. Quand j'ai de nouveau exécuté ssh, j'ai reçu l'invite de confirmation de clé qui était inattendue. Je me suis rendu compte qu'il y avait une clé fautive à enlever, donc après l'avoir enlevée et ré-exécutée ssh, j'ai reçu leWarning: Permanently added the ECDSA host key ...
message et seule la collecte des faits a continué.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 celui-ci était toujours bloqué.
J'ai trouvé 12 processus bloqués dans ma liste de processus accumulés au cours de la journée.
Une fois que j'ai tué ceux-ci, ça a recommencé à fonctionner.
la source
Il y a plusieurs raisons pour lesquelles ansible peut être suspendu lors de la collecte des faits, mais avant d'aller plus loin, voici le premier test que vous devriez faire dans une telle situation:
Ce test se connecte simplement à l'hôte et exécute suffisamment de code pour renvoyer:
Si cela fonctionne, vous pouvez à peu près éliminer 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, vous authentifier et exécuter un module ansible avec l'interpréteur python distant.
Maintenant, voici une liste (non exhaustive) de problèmes pouvant survenir au début d’un livre de jeu:
La commande exécutée par ansible attend une entrée interactive
Je me souviens de ce qui se passait sur les versions antérieures d'ansible, où une commande attendait une entrée interactive qui ne viendrait jamais, telle qu'un mot de passe sudo (lorsque vous oubliez un
-K
commutateur), ou l'acceptation d'une nouvelle empreinte digitale d'hôte ssh (pour une nouvelle cible hôte).Les versions modernes de ansible gèrent ces deux cas avec élégance et génèrent immédiatement une erreur pour les cas d'utilisation normaux. Par conséquent, à moins que vous n'appeliez vous-même 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 ssh maître mort
Il existe des 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 son utilisation de la 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 tout le livre de jeu (et même entre les livres).
C'est une bonne chose, car établir une nouvelle connexion est beaucoup plus lent et demande beaucoup de temps de calcul que d'utiliser une connexion existante.
En pratique, chaque connexion ssh vérifiera l'existence d'un socket sur
~/.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 ultérieure utilisera alors simplement cette prise pour passer par la connexion déjà établie.Même si la connexion établie expire enfin et se ferme après une absence d'utilisation prolongée, le socket est également fermé et nous revenons à la case départ.
Jusqu'ici tout va bien.
Parfois, cependant, la connexion meurt, 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 de WiFi à Ethernet, etc.).
Ce dernier exemple est une situation terrible: vous pouvez ssh sur 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'essayera même pas d'en établir une nouvelle.
À ce stade, nous voulons juste nous débarrasser de cette vieille prise, et le moyen le plus simple de le faire est de l'enlever:
C'est parfait pour une solution ponctuelle, 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:
Veuillez noter qu’au moment de la rédaction de ce document, quelques options ont changé (par exemple, c’est ce que ma dernière course m’a donné
ControlPath=/home/toadjaune/.ansible/cp/871b533295
), mais l’idée générale est toujours valable.La collecte de faits prend trop de temps
Au début de chaque jeu, ansible collecte de nombreuses informations sur le système cible et les intègre dans les faits . Ce sont des variables que vous pouvez ensuite utiliser dans votre Playbook, et qui sont généralement très utiles, mais parfois, obtenir cette information peut être très long (points de montage incorrects, disques avec une forte entrée / sortie, une charge élevée…)
Ceci étant dit, vous n'avez pas strictement besoin de faits pour gérer un livre de jeu, et presque certainement pas tous, alors essayons de désactiver ce dont nous n'avons pas besoin. Plusieurs options pour cela:
Pour le débogage, il est très pratique d’appeler le module de configuration directement à partir de la ligne de commande:
Cette dernière commande devrait être suspendue aussi bien que votre livre de jeu et éventuellement expirer (ou réussir). Maintenant, exécutons à nouveau le module en désactivant tout ce que nous pouvons:
Si le problème persiste, vous pouvez toujours essayer de désactiver totalement le module de votre jeu, mais il est fort probable que votre problème se situe ailleurs.
Si, toutefois, cela fonctionne bien (et rapidement), consultez la documentation du module . Vous avez deux options:
gather_subset
)gather_timeout
peut également vous aider à résoudre votre problème en vous accordant plus de temps (bien que ce soit pour réparer une erreur de délai d'attente, pas un blocage)Autres issues
Évidemment, d'autres choses peuvent mal se passer. Quelques conseils pour aider au débogage:
-vvvv
), car il vous montrera chaque commande exécutéeping
etsetup
modules directement à partir de la ligne de commande comme expliqué ci - dessusansible -m ping
cela ne fonctionne pasla source
Dmytro est sur quelque chose!
Ansible utilise le nom de domaine complet de l'hôte. Si votre hôte ne peut pas être résolu par le DNS et que vous n'avez pas de mappage dans
/etc/hosts
ansible, le délai d'attente du DNS sera expiré.En ajoutant
::1 <fqdn>
le fichier hôte des machines sur lesquelles vous vous connectez, Ansible obtiendra immédiatement le nom de domaine complet sans passer par DNS.Notez que l'hôte doit rechercher des hôtes à partir de
/etc/hosts
. Il s'agit de la configuration par défaut pour la plupart des systèmes linux, si ce n'est tous, mais si votre modification/etc/nsswitch.conf
également pose un problème.la source
J'ai eu le même problème. Vous ne recevez aucune information utile en exécutant ansible en mode prolixe.
Le serveur a été réapprovisionné avant d'exécuter le playbook.
La suppression du serveur de la liste des hôtes connus a résolu ce problème à l'aide de la commande ci-dessous.
Remarque: vous devez supprimer le nom d'hôte et l'adresse IP.
la source
Je ne sais pas si vous utilisez un cahier sudo - mais moi, c'était suspendu au mot de passe Sudo.
De la documentation - vous pouvez tuer cela, puis utiliser
-K
aussi bien.Bonne chance.
la source
L'empreinte digitale de votre système cible a peut-être changé, par exemple lorsque vous réinstallez le système d'exploitation du serveur. Vous devez supprimer les entrées dans known_hosts , ansible ne vous informera pas qu'une entrée non fiable pose problème, elle reste bloquée exactement comme vous le décrivez.
la source
Il semble qu’ansible ne puisse pas s’authentifier ... utilisez donc -k pour lui permettre de demander le mot de passe du serveur .... comme indiqué ci-dessous:
la source
La non-concordance du nom de domaine complet (FQDN) et du nom d’hôte peut également provoquer un hangout ansible. J'ai utilisé le nom de domaine complet avec un domaine différent du domaine du nom d'hôte. Après avoir rendu les deux égaux , ansible fonctionne parfaitement. Vous pouvez éventuellement comparer le nom de domaine complet et le nom d'hôte avant d'exécuter des tâches sur un hôte distant. J'espère que ça aide!
la source
J'ai résolu ce problème en ressaisissant la boîte de vagabond
la source
Dans mon cas, ansible a cessé de travailler au milieu d'une tâche. La raison était que mon agent ssh a cessé de fonctionner (
ssh-add -l
ne renvoyait rien). J'ai tout redémarré et cela a encore fonctionné. Vérifiez donc si votre agent ssh fonctionne correctement (ssh-add -l
ne doit pas rester bloqué).la source
La suppression
~/.ansible
seule ne l’a pas fait pour moi. Donc, pour vérifier ce qui est dans ce répertoire, je viens de faire un ctrl-z (mettre le processus en veille) et de vérifier, puis de continuer le processus ansible viafg
. Je n'ai rien supprimé dans ce cas. mais après cela a juste continué. Donc, j'ai juste essayé le ctrl-z->fg
seul et cela a également fonctionné. On se croirait danser sous la pluie, mais si quelqu'un est coincé, essayez-le aussi.la source
J'ai corrigé la cause de ce problème en suivant les conseils de Pourquoi mon ansible-playbook se bloque dans «Rassembler les faits»? article de blog.
Il peut être simplifié pour:
Définir
DEFAULT_KEEP_REMOTE_FILES=yes
pour conserver les commandes et activer-vvvv
Exécutez le playbook à nouveau.
Lorsque le jeu stucks copier la dernière commande shell imprimée (la partie après
/bin/sh -c
)Connectez-vous sur le serveur via
ssh
.Utilisez
strace
pour rejouer la dernière étape de la pièce. La commande step est copiée à partir de la-vvv
sortie. 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"
Vérifiez sur quel appel l'étape "effacée" est bloquée et résolvez-la :)
Dans mon cas, c'était un lecteur réseau inaccessible ...
la source
Le mot de passe de Sudo est le problème. Assurez-vous que (1) vous pouvez émettre 'sudo n'importe quoi ' sur un terminal nouvellement ouvert (où le mot de passe n'est pas mis en cache) sans indiquer à un (2) que la marionnette n'a pas annulé vos précédentes modifications manuelles 'sudoers'.
la source