'executar' como usuário errante, 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 a falhar porque não consegue encontrar npm :

execute[install q and zombiejs] (chef-redtail::default line 205) had an error: Errno::ENOENT: No such file or directory - npm install -g q zombie should mocha coffee-script

Efetuando login no vagrant via vagrant ssh e executando o comando manualmente funciona perfeitamente. Fazer o login como root, via sudo -i e executar o comando, falha pela mesma razão que a receita do chef falha (o npm é instalado localmente apenas para o usuário vagabundo, não para o root: é o que eu quero).

Então ... como posso especificar esse bloco de execute do chef para ser executado como o usuário errante e não como root?

UPDATE : acho que isso resume o 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 link

OUTRA ATUALIZAÇÃO : Então, só notei 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 tem o diretório /home/vagrant/.local/bin listado ... por que o primeiro eco retornará PATH com ele e o segundo retorno de exportação PATH sem ele? Esta é a questão?

    
por neezer 28.06.2012 / 01:34

3 respostas

13

Para executar um script ou um 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

Por causa de alguns bugs , o chef não define adequadamente o ambiente para o usuário especificado em executar . A solução do narced133 não funcionará.

    
por 28.09.2012 / 13:41
6

Você pode usar environment para 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 com freqüência para instalar plugins vagantes como o usuário vagabundo dentro das minhas VMs. Você também pode definir outras variáveis de ambiente, se necessário, por qualquer comando que esteja tentando executar.

    
por 21.05.2013 / 21:35
2

Parece que o Chef está sendo executado como o usuário vagabundo, mas não está pesquisando o mesmo PATH que o seu shell. Faça o login usando vagrant ssh e execute which npm . Ele retornará algo como /path/to/bin/npm . Substitua /path/to/bin/ abaixo para forçar o Chef a procurar o 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
    
por 28.06.2012 / 02:38

Tags