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'"]
vagrant ssh
investigar durante o travamento para ver se há algo útil nops
enetstat
? Além disso, um dos primeiros suspeitos em travamentos é o DNS - verifique se o DNS está resolvendo de dentro da máquina virtual.Respostas:
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
~/.ansible
diretório e ele simplesmente funciona novamente. Não consigo descobrir o porquê, mas foi resolvido.Se você conseguiu alterar novamente, tente limpar a
~/.ansible
pasta antes de atualizar o seu Vagrant.fonte
rm -rf ~/.ansible
não funcionou para mim no El CaptitanPara 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
fonte
gather_facts
como,False
mas essa dica realmente salvou o dia, porque esse também era meu problema.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:
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:
Solução: tente executar
ansible -m ping <destination> -k
o 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
setup
módulo (quando executado automaticamente no início de umaansible-playbook
execução, ou quando executado manualmente comoansible -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:fonte
ssh-keygen -R
comando 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 aWarning: Permanently added the ECDSA host key ...
mensagem e, em seguida, apenas a coleta de fatos continuou.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.
Depois que eu matei, começou a funcionar novamente.
fonte
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:
Este teste apenas se conecta ao host e executa código suficiente para retornar:
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
-K
opçã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:
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:
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:
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:
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:
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:
-vvvv
), pois ele mostrará todos os comandos executadosping
esetup
módulos diretamente da linha de comando, conforme explicado acimaansible -m ping
não funcionarfonte
Dmytro está pronto para algo!
O Ansible usa o FQDN do host. Se o seu host não
/etc/hosts
puder 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.conf
também pode ser um problema.fonte
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.
Nota: Você precisa remover o nome do host e o endereço IP
fonte
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
-K
também.Boa sorte.
fonte
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.
fonte
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:
fonte
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!
fonte
Resolvi esse problema redefinindo a caixa vagrant
fonte
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 -l
não estava retornando nada). Eu reiniciei tudo e funcionou novamente. Portanto, verifique se o seu ssh-agent está funcionando corretamente (ssh-add -l
não deve ficar preso).fonte
Excluir
~/.ansible
sozinho 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 viafg
. Não apaguei nada nesse caso. mas depois continuou. Então, eu apenas tentei o ctrl-z->fg
sozinho e também funcionou. Parece dança da chuva, mas se alguém estiver preso, tente isso também.fonte
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:
Configure
DEFAULT_KEEP_REMOTE_FILES=yes
para preservar os comandos e ativar-vvvv
Execute o manual novamente.
Quando o play stuck copia o último comando do shell impresso (a parte depois
/bin/sh -c
)Faça logon no servidor via
ssh
.Use
strace
para reproduzir o último passo da peça. O comando step é copiado da-vvv
saí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"
Verifique em qual chamada a etapa "straced" ficou presa e corrija-a :)
No meu caso, era uma unidade de rede inacessível ...
fonte
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'.
fonte