`execute` como usuário vagante, não root, com chef-solo?

10

Estou tentando executar o seguinte comando do chef:

# install zombiejs, q (promises), should, coffee-script & mocha                 
execute "install q and zombiejs" do                                             
  cwd "/home/vagrant"                                                           
  user "vagrant"                                                                
  action :run                                                                   
  command "npm install -g q zombie should mocha coffee-script"                  
end

Mas continua falhando porque não consegue encontrar npm:

execute [install q e zombiejs] (chef-redtail :: linha padrão 205) cometeu um erro: Errno :: ENOENT: Esse arquivo ou diretório não existe - npm install -gq zombie deve mocha coffee-script

O login no vagrant via vagrant sshe a execução manual do comando funcionam perfeitamente bem. O login como root, via sudo -ie executando o comando, falha pelo mesmo motivo que a receita do chef falha (o npm é instalado localmente apenas para o usuário vagante, não para root: é isso que eu quero).

Então ... como posso especificar esse executebloco de chef para ser executado como usuário vagante e não como root?


UPDATE : Acho que isso resume meu problema:

(ssh) /vagrant git:backbone ❯ whoami
vagrant

(ssh) /vagrant git:backbone ❯ which npm
/home/vagrant/.local/bin/npm

(ssh) /vagrant git:backbone ❯ echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i which npm
npm not found

via http://tickets.opscode.com/browse/CHEF-2517


OUTRA ATUALIZAÇÃO : Então, acabei de perceber essa discrepância:

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i export
HOME=/home/vagrant
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LOGNAME=vagrant
MAIL=/var/mail/vagrant
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
SHELL=/bin/zsh
SSH_AUTH_SOCK=/tmp/ssh-uJUopA4146/agent.4146
SUDO_COMMAND='/bin/zsh -c export'
SUDO_GID=1001
SUDO_UID=1000
SUDO_USER=vagrant
TERM=xterm
USER=vagrant

Observe a diferença em PATH? A exportação não possui o /home/vagrant/.local/bindiretório listado ... por que o primeiro eco retornaria PATHcom ele e a segunda exportação retornaria PATHsem ele? Esse é o problema?

neezer
fonte

Respostas:

13

Para executar um script ou comando como usuário, você precisa combinar su -l e bash -i :

 execute "npm_install" do
    command "su vagrant -l -c 'cd /shared-with-host/helperScripts/ && bash -i npm install -g q zombie should mocha coffee-script'" 
    action :run
  end

Devido a alguns erros , o chef não define adequadamente o ambiente para o usuário especificado em execução . A solução do narced133 não funcionará.

Skarab
fonte
6

Você pode usar environmentpara definir as variáveis ​​de ambiente HOME e USER em seu bloco de execução.

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    environment ({'HOME' => '/home/vagrant', 'USER' => 'vagrant'})                                                             
    command "npm install -g q zombie should mocha coffee-script"                  
end

Eu uso isso frequentemente para instalar plugins vagantes como o usuário vagante dentro de minhas VMs. Você também pode definir outras variáveis ​​de ambiente, se necessário, por qualquer comando que esteja tentando executar.

Michael Goetz
fonte
Esta é uma resposta muito limpa IMHO.
precisa saber é o seguinte
2

Parece que o Chef está executando como o usuário vagabundo, mas não está procurando o mesmo CAMINHO que o seu shell. Entre usando vagrant sshe execute which npm. Ele retornará algo como /path/to/bin/npm. Substitua /path/to/bin/abaixo para forçar o Chef a pesquisar no diretório apropriado.

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    path ["/path/to/bin/"]                                                               
    command "npm install -g q zombie should mocha coffee-script"                  
end
narced133
fonte
Apenas tentei isso; sem dados. Ainda falha com o mesmo erro na postagem. Alguma outra sugestão?
neezer
Poderia tentar apontar o comando diretamente para o link simbólico npm, em vez de tentar obter o caminho certo. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133
Posso confirmar que "caminho" não faz nada, mas apontar o comando diretamente para o binário faz o truque. Isso parece um bug no Chef.
FRKT