Posso ssh para o host remoto e fazer um source /home/username/.bashrc
- tudo funciona bem. No entanto, se eu fizer:
- name: source bashrc
sudo: no
action: command source /home/username/.bashrc
Eu recebo:
failed: [hostname] => {"cmd": ["source", "/home/username/.bashrc"], "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory
Não tenho ideia do que estou fazendo de errado ...
source
só faz sentido quando você o executa dentro de um shell existente - ele executa comandos nesse shell e, portanto, só é útil / útil quando há um shell existente cujo estado ou configuração você deseja alterar. Quando você executa uma ação ansible, isso cria um novo shell , e executa um comando dentro desse shell - então você não estaria atualizando as variáveis de ambiente em qualquer outro contexto, então não teria nenhum efeito útil / duradouro , mesmo que funcione sem erros.source
só define variáveis para a duração do shell em que é executado . E esse shell saiu (e as variáveis que ele define foram perdidas) no momento em que o comando ansible sai e o próximo começa.source
, antes de sair.source
funcione da maneira que você provavelmente está acostumado.Respostas:
Você tem duas opções para usar a fonte com ansible. Uma é com o comando "shell:" e / bin / sh (o padrão ansible). "fonte" é chamada de "." em / bin / sh. Portanto, seu comando seria:
Observe que você deve executar um comando após obter .bashrc b / c. Cada sessão ssh é distinta - cada comando ansible é executado em uma transação ssh separada.
Sua segunda opção é forçar o shell Ansible a usar o bash e então você pode usar o comando "source":
Finalmente, observarei que você pode querer realmente fornecer "/ etc / profile" se estiver no Ubuntu ou similar, que simula mais completamente um login local.
fonte
.
->source
- e você imediatamente fez isso :)source "/etc/profile"
- não funcionou para mim. Funcionou:source "~/.profile"
shell: . ~/.bashrc && nvm install {{ node_version }}
e está dizendonvm command not found
,. Como posso resolver isso?Portanto
command
, só executará executáveis.source
per se não é um executável. (É um comando de shell embutido). Existe algum motivo pelo qual você desejasource
uma variável de ambiente completa?Existem outras maneiras de incluir variáveis de ambiente no Ansible. Por exemplo, a
environment
diretiva:Outra forma é usar o
shell
módulo Ansible:ou
Nesses casos, a instância / ambiente do shell será encerrado assim que a etapa Ansible for executada.
fonte
shell source /home/username/.bashrc
se tornashell . /home/username/.bashrc
executable=/usr/bin/bash
que irá então executá-la no bash se estiver disponível como tal.Sei que esta resposta veio tarde demais, mas vi em código suficiente que você pode usar a opção sudo
-i
para:Como dito na documentação
fonte
Eu estava tendo esse mesmo problema ao tentar fazer o virtualenvwrapper funcionar em um servidor Ubuntu. Eu estava usando o Ansible assim:
mas o comando de origem não estava funcionando.
Por fim, descobri que o arquivo .bashrc tem algumas linhas na parte superior do arquivo que impedem que o código-fonte funcione quando chamado por Ansible:
Comentei essas linhas em .bashrc e tudo funcionou conforme o esperado depois disso.
fonte
.bashrc
arquivos. Você provavelmente deseja criar um arquivo de shell diferente ou usarBASH_ENV
conforme discutido nos documentos do bash.Bem, eu tentei as respostas listadas, mas elas não funcionaram para mim durante a instalação do Ruby através do rbenv . Tive que fornecer as linhas abaixo de
/root/.bash_profile
Finalmente, eu vim com isso
Pode-se usar isso com qualquer comando.
fonte
2.2.0.0
. No entanto, isso me incomoda ebecome
, em vez disso ... Não consegui descobrir uma combinação desses parâmetros de "método" que funcionasse de qualquer maneira.become_method
become_user
Eu descobri que se tornou a melhor solução:
Você pode alterar o usuário adicionando (padrão: root):
Mais informações aqui: Ansible se tornou
fonte
Muitas respostas recomendam fonte ~ / .bashrc, mas o problema principal é que o shell ansible não é interativo e a implementação de ~ / .bashrc por padrão ignora o shell não interativo (verifique seu início).
A melhor solução para executar comandos como usuário após seu login interativo SSH que encontrei é:
bash: '-i' significa shell interativo, então .bashrc não será ignorado '-l' significa shell de login que fornece o perfil completo do usuário
fonte
Eu tentei todas as opções acima com ansible 2.4.1.0 e ninguém funciona até as outras duas e aqui está o detalhe para reproduzir o case.
E este é o teste ansible :
E este é o resultado:
Existem duas opções funcionadas:
shell: /bin/bash -ic 'ta'
shell: ssh -tt localhost /bin/bash -ci 'ta'
mas este requer a entrada de senha localmente.fonte
Meus 2 centavos, eu circumnavigated o problema abastecimento
~/.nvm/nvm.sh
em~/.profile
e em seguida, usandosudo -iu
como sugerido em outra resposta.Julgado em janeiro de 2018 vs Ubuntu 16.04.5
fonte
O caminho certo deve ser:
Nota: é um teste na
ansible 2.0.2
versãofonte