Ansible preso em reunir fatos

53

Estou tendo alguns problemas estranhos com minha caixa ansible (vagrant).

Tudo funcionou ontem e meu manual funcionou bem.

Hoje, ansible depende de "reunir fatos"?

Aqui está a saída detalhada:

<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
fonte
11
Trava por quanto tempo? Você tentou vagrant sshinvestigar durante o travamento para ver se há algo útil no pse netstat? Além disso, um dos primeiros suspeitos em travamentos é o DNS - verifique se o DNS está resolvendo de dentro da máquina virtual.
Antonis Christofides
11
Obrigado pelo seu comentário. A solução era simples, destruidora de vagabundos e vagabunda ... Ainda acho estranho que tenha parado de funcionar?
Bj Blazkowicz
11
Eu tive um problema com o Ansible empacotar se houver montagens inacessíveis (cifs-).
Reitide
11
Apenas aconteceu, foi causado por uma chave de host desatualizada no arquivo known_hosts. Estranho que a conexão não falhe, como é habitual neste caso.
GnP
Você pode verificar os logs sshd na caixa do vagrant? Pode ser necessário definir "LogLevel DEBUG" em / etc / ssh / sshd_config, mas isso pode fornecer mais informações sobre o que está acontecendo.
Pablo Martinez

Respostas:

31

Eu estava tendo um problema semelhante com o ping do Ansible no Vagrant, que de repente parou sem motivo e anteriormente funcionou absolutamente bem. Ao contrário de qualquer outro problema, como ssh ou problema de conexão, ele morre para sempre sem tempo limite.

Uma coisa que fiz para resolver esse problema foi limpar o ~/.ansiblediretório e ele simplesmente funciona novamente. Não consigo descobrir o porquê, mas foi resolvido.

Se você conseguiu alterar novamente, tente limpar a ~/.ansiblepasta antes de atualizar o seu Vagrant.

yikaus
fonte
3
rm -rf ~/.ansiblenão funcionou para mim no El Captitan
Quanlong
8
rm -rf ~ / .ansible / cp é suficiente
melihovv
20

Para mim, o módulo do módulo de instalação estava preso em uma montagem NFS morta.

Se você fizer um "df" na sua máquina e nada acontecer, poderá estar no mesmo caso.

PS: se você não pode desmontar o compartilhamento / ponto de montagem do NFS, considere usar o "umount -l" incorreto

Sebastien DA ROCHA
fonte
Sim, foi isso!
Saurabh Nanda
Inicialmente, resolvi o problema definindo gather_factscomo, Falsemas essa dica realmente salvou o dia, porque esse também era meu problema.
pkaramol 23/04
18

O Ansible pode travar dessa maneira por vários motivos, geralmente devido a um problema de conexão ou porque o módulo de instalação trava. Veja como restringir o problema para que você possa resolvê-lo.

O Ansible não pode se conectar ao host de destino

Problemas com a chave do host (hosch)

1) Nas versões mais antigas do Ansible (2.1 ou mais antigo), o Ansible nem sempre informava se a chave do host do destino não existe na origem ou se há uma incompatibilidade.

Solução: tente abrir uma conexão SSH com os mesmos parâmetros para esse destino. Você pode encontrar erros de SSH que precisa resolver e o comando funcionará.

2) Às vezes, o Ansible exibe uma mensagem de conexão SSH no meio de outros status, fazendo com que o Ansible "congele" nessa tarefa:

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

Nesse caso, basta digitar "yes" para tantas perguntas sobre SSH quantas forem solicitadas, permitindo que a reprodução continue. Depois, você pode corrigir os problemas conhecidos de root_hosts.

Problemas de autenticação de chave privada

Se estiver usando autenticação baseada em chave x senha, outros problemas incluem:

  • A chave privada pode não estar configurada corretamente no destino
  • A chave privada pode ter permissões incorretas localmente (deve ser legível apenas pelo usuário que executa o trabalho Ansible)

Solução: tente executar ansible -m ping <destination> -ko host com problema - se isso não funcionar, tente as soluções de Problemas principais do host acima.

Ansible não pode reunir fatos rapidamente

O setupmódulo (quando executado automaticamente no início de uma ansible-playbookexecução, ou quando executado manualmente como ansible -m setup <host>) geralmente pode travar ao reunir fatos de hardware (por exemplo, se você obtém informações de disco de hosts com alta E / S, entradas de montagem incorretas, etc.).

Solução: tente executar ansible -m setup -a gather_subset=!all <destination>. Se isso funcionar, considere configurar esta linha no seu ansible.cfg:

gather_subset=!hardware
Jordan Anderson
fonte
11
Passar para 'gather_subset =! Hardware' para a instalação funcionou para uma VM específica que não estava respondendo.
JamesP
2
Corrigido para mim. Pontos de montagem desonestos, eu acho. Eu tinha uma VM que usei para provisionamento ansible e funcionou até adicionar um novo compartilhamento NFS. Agora não, até que eu adicionei o acima.
David Boshton
Acabou sendo um problema-chave no meu caso. O host foi recriado novamente; portanto, minha primeira execução falhou e executei o ssh-keygen -Rcomando sugerido para remover a chave incorreta. Eu executei o ssh uma vez para adicionar a chave, mas a segunda execução foi interrompida. Quando executei o ssh novamente, recebi o prompt de confirmação de chave que era inesperado. Percebi que havia uma chave ofensiva que precisava ser removida; portanto, depois de removê-la e executar novamente o ssh, recebi a Warning: Permanently added the ECDSA host key ...mensagem e, em seguida, apenas a coleta de fatos continuou.
haridsv
Posso confirmar a observação de @DavidBoshton. Teve esse problema em uma VM com diretórios NFS montados, que não estavam disponíveis (problema no servidor NFS). Depois de corrigir o servidor NFS funcionou
tschale
7

Eu tive um problema semelhante com Ansible pendurado em Gathering Facts. Eu reduzi meu script para um prompt sem tarefas ou funções e ele ainda estava travado.

Encontrei 12 processos pendentes na minha lista de processos que se acumularam ao longo do dia.

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

Depois que eu matei, começou a funcionar novamente.

Tim Moses
fonte
5

Há muitas razões pelas quais o ansible pode travar na coleta de fatos, mas antes de prosseguir, aqui está o primeiro teste que você deve fazer em uma situação dessas:

ansible -m ping <hostname>

Este teste apenas se conecta ao host e executa código suficiente para retornar:

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

Se isso funcionar, você poderá excluir qualquer problema de configuração ou conectividade, pois isso prova que você pode resolver o nome do host de destino, abrir uma conexão, autenticar e executar um módulo ansible com o interpretador python remoto.

Agora, aqui está uma lista (não exaustiva) de coisas que podem dar errado no início de um manual:

O comando executado pelo ansible está aguardando uma entrada interativa

Lembro-me disso em versões mais antigas, em que um comando aguardaria uma entrada interativa que nunca chegaria, como uma senha sudo (quando você esqueceu uma -Kopção) ou a aceitação de uma nova impressão digital do host ssh (para um novo destino). hospedeiro).

As versões modernas do ansible lidam com esses dois casos normalmente e geram um erro imediatamente para casos de uso normais; portanto, a menos que você esteja fazendo coisas como chamar ssh ou sudo, você não deve ter esse tipo de problema. E mesmo se você o fizesse, seria após a coleta de fatos.

Conexão mestre ssh morto

Existem algumas opções muito interessantes passadas para o cliente ssh, no log de depuração fornecido aqui:

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

Essas opções estão documentadas no man ssh_config .

Por padrão, o ansible tentará ser inteligente em relação ao uso da conexão ssh. Para um determinado host, em vez de criar uma nova conexão para todas as tarefas do jogo, ele será aberto uma vez e será mantido por todo o manual (e mesmo entre os manuais).

Isso é bom, pois o estabelecimento de uma nova conexão é muito mais lento e exige mais computação do que usar uma já existente.

Na prática, toda conexão ssh verificará a existência de um soquete em ~/.ansible/cp/some-host-specific-path. A primeira conexão não pode encontrá-lo; portanto, ele se conecta normalmente e depois o cria. Toda conexão subsequente usará esse soquete para passar pela conexão já estabelecida.

Mesmo que a conexão estabelecida finalmente atinja o tempo limite e feche depois de não ser usada por tempo suficiente, o soquete também está fechado e voltamos à estaca zero.

Por enquanto, tudo bem.

Às vezes, no entanto, a conexão realmente morre, mas o cliente ssh ainda a considera estabelecida. Isso normalmente acontece quando você executa o manual do laptop e perde a conexão Wi-Fi (ou muda de Wi-Fi para Ethernet, etc.)

Este último exemplo é uma situação terrível: você pode ssh na máquina de destino com uma configuração ssh padrão, mas enquanto sua conexão anterior ainda for considerada ativa, o ansible nem tentará estabelecer uma nova.

Neste ponto, apenas queremos nos livrar desse soquete antigo, e a maneira mais simples de fazer isso é removê-lo:

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

Isso é perfeito para uma correção de uma só vez, mas se isso acontecer com muita freqüência, talvez você precise procurar uma correção de longo prazo. Aqui estão alguns indicadores que podem ajudar a alcançar esse objetivo:

  • Inicie playbooks a partir de um servidor (com uma conexão de rede muito mais estável que a do seu laptop)
  • Use a configuração ansible ou diretamente a configuração do cliente ssh para desativar o compartilhamento de conexão
  • Use os mesmos recursos, mas para ajustar o tempo limite, para que uma falha na conexão principal se esgote mais rapidamente

Observe que, no momento da redação deste artigo, algumas opções foram alteradas (por exemplo, minha última execução ControlPath=/home/toadjaune/.ansible/cp/871b533295), mas a ideia geral ainda é válida.

Coleta de fatos, na verdade, leva muito tempo

No início de cada jogada, o ansible coleta muitas informações no sistema de destino e as coloca em Fatos . Essas são as variáveis ​​que você pode usar em seu manual e geralmente são realmente úteis, mas às vezes a obtenção dessas informações pode ser muito longa (pontos de montagem ruins, discos com alto I / O, alta carga ...)

Dito isto, você não precisa estritamente de fatos para executar um manual, e quase certamente nem todos, então vamos tentar desativar o que não precisamos. Várias opções para isso:

Para propósitos de depuração, é realmente conveniente chamar o módulo de instalação diretamente da linha de comando:

ansible -m setup <hostname>

Este último comando deve travar, assim como o seu manual, e eventualmente expirar (ou obter êxito). Agora, vamos executar o módulo novamente, desativando tudo o que podemos:

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

Se isso ainda travar, você sempre pode tentar desativar totalmente o módulo no seu jogo, mas é realmente provável que o seu problema esteja em outro lugar.

Se, no entanto, funcionar bem (e rapidamente), consulte a documentação do módulo . Você tem duas opções:

  • Limite a coleta de fatos a um subconjunto, excluindo o que você não precisa (consulte os possíveis valores para gather_subset)
  • gather_timeout também pode ajudar a corrigir o problema, permitindo mais tempo (embora isso seja para corrigir um erro de tempo limite, não um travamento)

Outros problemas

Obviamente, outras coisas podem dar errado. Alguns ponteiros para ajudar na depuração:

  • Use o nível de verbosidade máximo ansible ( -vvvv), pois ele mostrará todos os comandos executados
  • Use pinge setupmódulos diretamente da linha de comando, conforme explicado acima
  • Tente ssh manualmente se ansible -m pingnão funcionar
toadjaune
fonte
4

Dmytro está pronto para algo!

O Ansible usa o FQDN do host. Se o seu host não /etc/hostspuder ser resolvido pelo DNS e você não tiver um mapeamento em espera, o tempo limite do DNS será excedido.

Ao adicionar ::1 <fqdn>o arquivo host das máquinas que você está conectando, o Ansible obterá o FQDN imediatamente sem passar pelo DNS.

Observe que o host deve procurar hosts de /etc/hosts, este é o padrão para a maioria, se não todos, sistemas linux, mas se a sua edição /etc/nsswitch.conftambém pode ser um problema.

user56781
fonte
2

Eu tive o mesmo problema. Não há informações úteis sobre a execução do ansible no modo detalhado.

O servidor foi provisionado novamente antes de executar o manual.

A remoção do servidor da lista de hosts conhecidos corrigiu isso usando o comando abaixo.

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

Nota: Você precisa remover o nome do host e o endereço IP

rleon
fonte
No meu caso, reutilizei um endereço IP. Portanto, duas chaves de host estavam presentes no arquivo known_hosts
Karthik
1

Não sei se você está usando um manual do sudo - mas eu estava e estava pendurado na senha do sudo.

A partir da documentação - você pode matar isso e usá-lo -Ktambém.

Boa sorte.

Rcynic
fonte
1

Talvez a impressão digital do seu sistema de destino tenha mudado, por exemplo, quando você reinstala o sistema operacional do servidor. Você deve excluir as entradas em known_hosts , o ansible não notificará que o problema é uma entrada não confiável , mas ela ficará travada exatamente como você descreve.

Schroeffu
fonte
1

Parece que o ansible não pode se autenticar ... então use -k para permitir que o ansible solicite a senha do servidor .... como mostrado abaixo:

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

A incompatibilidade de FQDN e nome de host também pode causar um hangout ansível. Eu usei o FQDN com domínio diferente do domínio do nome do host. Depois de tornar os dois iguais , o ansible funciona perfeitamente. Possivelmente ansible compara FQDN e nome do host antes de executar tarefas no host remoto. Espero que ajude!

Dmytro Ozarkiv
fonte
0

Resolvi esse problema redefinindo a caixa vagrant

vagrant destroy
vagrant up
Quanlong
fonte
0

No meu caso, o ansible parou de funcionar no meio de uma tarefa. O motivo foi porque meu agente ssh parou de funcionar ( ssh-add -lnão estava retornando nada). Eu reiniciei tudo e funcionou novamente. Portanto, verifique se o seu ssh-agent está funcionando corretamente ( ssh-add -lnão deve ficar preso).

Vasco
fonte
0

Excluir ~/.ansiblesozinho não fez isso por mim. Então, para verificar o que há nesse diretório, eu apenas fiz um ctrl-z (coloque o processo em suspensão) e verifiquei e, em seguida, continuei o processo ansible via fg. Não apaguei nada nesse caso. mas depois continuou. Então, eu apenas tentei o ctrl-z-> fgsozinho e também funcionou. Parece dança da chuva, mas se alguém estiver preso, tente isso também.

erikbwork
fonte
0

Corrigi a causa desse problema, seguindo o conselho de Por que meu manual ansible está em "Reunindo fatos"? publicação no blog.

Pode ser simplificado para:

  1. Configure DEFAULT_KEEP_REMOTE_FILES=yespara preservar os comandos e ativar-vvvv

  2. Execute o manual novamente.

  3. Quando o play stuck copia o último comando do shell impresso (a parte depois /bin/sh -c)

  4. Faça logon no servidor via ssh.

  5. Use stracepara reproduzir o último passo da peça. O comando step é copiado da -vvvsaída. Por exemplo:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"

  6. Verifique em qual chamada a etapa "straced" ficou presa e corrija-a :)

No meu caso, era uma unidade de rede inacessível ...

Yuri
fonte
-1

A senha do Sudo é o problema. Certifique-se de que (1) você pode emitir 'sudo qualquer coisa ' no terminal recém-aberto (onde a senha não está armazenada em cache) sem fornecer um (2) que o fantoche não tenha revertido as alterações manuais anteriores dos 'sudoers'.

witkacy26
fonte
11
Fantoche? Que boneco? Esta é uma pergunta ansível.
Deer Hunter
Sim eu conheço. Algumas pessoas podem ter fantoche instalado na mesma máquina onde ansible é usado (este foi realmente o meu caso uma vez)
witkacy26