Como posso ter ansible reiniciar a sessão ssh depois de instalar o nvm?

1

O nvm exige que um usuário efetue logout / login após a instalação para que as alterações entrem em vigor. Como posso permitir isso em uma tarefa ansible executando via vagrant. aqui está o que eu tentei:

- name : Install nvm
  shell: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash
  failed_when: False
  register: nvm_installed

- name: Kill open ssh sessions - ansible should log back in on next task
  shell: "ps -ef | grep sshd | grep 'whoami' | awk '{print \"kill -9\", $2}' | sh"
  when: nvm_installed | changed
  failed_when: false

- name : Install Node.js v 4.2.x
  command : nvm install v4.2

Mas recebo o erro:

fatal: [default] => SSH Error: ssh_exchange_identification: Connection closed by remote host
    while connecting to 127.0.0.1:2222
It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue.

TASK: [check if rpmforge installed] ******************************************* 
FATAL: no hosts matched or all hosts have already failed -- aborting

o comando vagrant ssh também falha com o erro:

ssh_exchange_identification: Connection closed by remote host

Eu baseei isso na resposta dada aqui - link

Eu acho que talvez o comando kill esteja matando o daemon sshd em si?

ps -ef | grep sshd | grep 'whoami'
root      2621  1247  0 11:30 ?        00:00:00 sshd: vagrant [priv]
vagrant   2625  2621  0 11:30 ?        00:00:00 sshd: vagrant@notty
root      3232  1247  4 11:34 ?        00:00:00 sshd: vagrant [priv]
vagrant   3235  3232  0 11:34 ?        00:00:00 sshd: vagrant@pts/0
vagrant   3252  3236  0 11:34 pts/0    00:00:00 grep sshd

UPDATE

Eu também tentei o seguinte:

- name : Install nvm
  shell: "curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash"
  register: nvm_installed
  failed_when: False


- name : source bash profiles
  shell : source /home/vagrant/.bashrc
  when: nvm_installed
  register: sourced

- name : Install Node.js v 4.2.x
  command : nvm install v4.2
  when: sourced

mas receba o seguinte erro:

TASK: [Install Node.js v 4.2.x] *********************************************** 
failed: [default] => {"cmd": "nvm install v4.2", "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/Users/lukemackenzie/playbook.retry

default                    : ok=10   changed=3    unreachable=0    failed=1   

Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

Se eu executar a etapa Instalar nvm manualmente na máquina gerenciada, ele diz que o seguinte foi anexado a .bashrc :

export NVM_DIR="/home/vagrant/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
    
por codecowboy 08.01.2016 / 12:19

3 respostas

0

Veja o que funcionou:

- name : Install nvm
  shell: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash
  register: nvm_installed
  sudo: False

- name: Show nvm_installed output
  debug:
    msg: '{{nvm_installed}}'


- name : source bash profiles
  shell: source ~/.bashrc
  args:
     executable: /bin/bash
  register: sourced
  when : nvm_installed | success
  sudo: False


- name: Show sourced output
  debug:
    msg: '{{sourced}}'


- name : Install Node.js v 4.2.x
  shell : '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && nvm install v4.2'
  when: sourced|success
  sudo: False
  environment:
    NVM_DIR: /home/vagrant/.nvm

Pode não ser necessário incluir o comando source como parece ansible efetuar login com um shell não interativo para que o conteúdo de .bashrc nunca seja captado.

Veja também link

    
por 12.01.2016 / 10:57
1

Como já foi mencionado nos comentários, o .profile deve ser suficiente para instalar nvm .

Basta substituir a tarefa de reinicialização do sshd por esta tarefa:

- name: Source bash profile.
  shell: source $HOME/.profile $HOME/.bash_profile

Você também pode querer dar uma olhada neste vagrantfile .

Se você precisar reiniciar o servidor ssh (por qualquer outro motivo), você pode tentar essa abordagem conforme documentado neste Post do blog Ansible :

- name : Install nvm
  shell: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash
  ignore_errors: true
  register: nvm_installed

- name: Kill open ssh sessions - ansible should log back in on next task
  shell: "ps -ef | grep sshd | grep 'whoami' | awk '{print \"kill -9\", $2}' | sh"
  async: 0
  poll: 0
  when: nvm_installed | changed

- name: waiting for server to come back
  local_action: wait_for host={{ inventory_hostname }} state=started

- name : Install Node.js v 4.2.x
  command : nvm install v4.2
    
por 08.01.2016 / 20:27
1

Eu criei um papel do Galaxy que funcionará com o Ansible 2: ssh-reconnect

Uso:

- name : Install nvm
  shell: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash
  ignore_errors: true
  notify:
    - Kill all ssh connections
    
por 09.02.2016 / 15:58