A tarefa Command ou Shell trava ao usar o ssh para criar um túnel

2

Estou usando o Ansible para enviar configurações. Eu tenho uma tarefa dentro de um playbook que eu quero iniciar um túnel ssh em segundo plano para o MongoDB. O comando de tarefa que estou usando é

- name: Start tunnel service
  shell: ssh -f -N -L 27018:localhost:27017 mongo@remote-server 

Mas não importa o que eu faça, não posso continuar ansioso. Em vez disso, ele trava ou age como se estivesse esperando algo para retornar uma resposta. Se eu executar este comando no shell como normal, ele não tem nenhum problema e eu posso conectar-me à instância do mongo remoto.

No começo eu pensei porque estava configurando um novo servidor que o known_hosts do ssh estava esperando que um usuário respondesse sim / não antes de prosseguir. Neste caso eu tentei duas opções. Primeiro, tentei adicionar a impressão digital do servidor ao arquivo known_hosts. Depois de executar a partir do shell, ele não solicitou uma entrada de known_hosts, mas o ansible também continua pendente. Eu também tentei a opção de

ssh -o StrictHostKeyChecking=no -f -N -L 27018:localhost:27017 mongo@remote-server

Mas esta opção também está produzindo o mesmo problema com suspensão ansiosa.

Eu tentei alternar entre o comando ansible e o módulo shell sem qualquer alteração no problema. Minha experiência mais recente foi tentar nohup antes do comando, mas isso também não está funcionando.

nohup ssh -f -N -L 27018:localhost:27017 mongo@remote-server

Também tentei pensar criativamente que, se um processo diferente fosse capaz de executar o comando que depois enviaria uma resposta de volta para o ansible, tentei envolvê-lo como uma tarefa do Upstart. Eu coloquei o comando shell dentro de um arquivo /etc/tunnel.sh e também coloquei o script upstart em /etc/init/tunnel.conf . Mas isso também não funciona e parece ter problemas para iniciar o script. Se eu executar sudo service tunnel start , ele será iniciado, mas terá problemas para parar. Embora executar isso através de ansible como um comando não faça nada e apenas fica lá e trava como todos os outros experimentos.

- name: Start tunnel service
  command service tunnel start
    
por lumberjacked 21.09.2013 / 05:03

4 respostas

2

Se você estiver usando o sudo e uma chave, eu apostaria que você não está preservando a variável de ambiente SSH_AUTH_SOCK. Isso será necessário para estabelecer uma conexão da máquina orquestrada com a instância do mongodb. Nesta situação, você deve adicionar algo como o seguinte a / etc / sudoers:

Defaults        env_keep+=SSH_AUTH_SOCK
Defaults        env_reset
    
por 21.10.2013 / 07:04
2

Eu fiz o mesmo teste e descobri que é porque o comando ssh pede confirmação de impressão digital quando você usa o ssh pela primeira vez, portanto fica preso e não consegue lidar com o prompt remoto.

O caminho mais fácil pode ser ajustar o comando ssh tunnel como abaixo:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -f -N -L 27018:localhost:27017 mongo@remote-server 

ele ignorará a checagem do hostkey e colocará sua ansiosa tarefa em prática.

    
por 20.10.2014 / 05:21
2

Você também pode usar as ações assíncronas do ansible ( link )

- name: Start tunnel service
  shell: ssh -f -N -L 27018:localhost:27017 mongo@remote-server
  async: 15
  poll: 5

Isto permitirá ansible completar a tarefa dando-lhe 15 seg de tempo máximo de execução para executar e sondar a cada 5 segundos para uma conclusão.

    
por 21.02.2015 / 01:41
0

Em vez de nohup, por que não tentar usar screen ?

ssh user@server screen -dR command

screen é muito melhor porque você pode simplesmente desanexar a sessão com CTRL-A, D, e depois sair, e quando você precisar voltar para a sessão mais tarde, simplesmente entre no servidor com ssh e pressione CTRL- A, 1 ou apenas pressione CTRL-A até carregar a sessão.

    
por 21.09.2013 / 14:21