`ejecutar` como usuario vagabundo, no root, con chef-solo?

10

Estoy tratando de ejecutar el siguiente comando de 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

Pero sigue fallando porque no puede encontrar npm:

Ejecutar [instalar q y zombiejs] (chef-redtail :: línea predeterminada 205) tuvo un error: Errno :: ENOENT: No existe tal archivo o directorio - npm install -gq zombie debería moca coffee-script

Iniciar sesión en vagabundo a través de vagrant sshy ejecutar el comando manualmente funciona perfectamente bien. Iniciar sesión como root, a través sudo -iy ejecutar el comando falla por la misma razón que falla la receta del chef (npm se instala localmente solo para el usuario vagabundo, no para root: esto es lo que quiero).

Entonces ... ¿cómo puedo especificar que este executebloque de chef se ejecute como el usuario vagabundo y no como root?


ACTUALIZACIÓN : Creo que esto resume mi 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

a través de http://tickets.opscode.com/browse/CHEF-2517


OTRA ACTUALIZACIÓN : así que acabo de notar esta discrepancia:

(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 la diferencia en PATH? La exportación no tiene el /home/vagrant/.local/bindirectorio listado ... ¿por qué el primer eco volvería PATHcon él y la segunda exportación volvería PATHsin él? ¿Es este el problema?

Neezer
fuente

Respuestas:

13

Para ejecutar un script o un comando como usuario, debe combinar su -l y 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

Debido a algunos errores , el chef no establece correctamente el entorno para el usuario especificado en ejecución . La solución de narced133 no funcionará.

Skarab
fuente
6

Puede usar environmentpara establecer las variables de entorno HOME y USER en su bloque de ejecución.

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

Utilizo esto con frecuencia para instalar complementos vagabundos como usuario vagabundo dentro de mis máquinas virtuales. También puede establecer otras variables de entorno si es necesario mediante cualquier comando que esté intentando ejecutar.

Michael Goetz
fuente
Esta es una respuesta muy limpia en mi humilde opinión.
Ben Liyanage
2

Parece que Chef se está ejecutando como el usuario vagabundo pero no está buscando la misma RUTA que su shell. Inicie sesión usando vagrant sshy ejecute which npm. Volverá algo así /path/to/bin/npm. Reemplace a /path/to/bin/continuación para obligar al Chef a buscar en el directorio apropiado.

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
fuente
Solo intenté eso; no dados. Todavía falla con el mismo error en la publicación. ¿Cualquier otra sugerencia?
neezer
Podría intentar apuntar el comando directamente al enlace simbólico npm en lugar de intentar obtener la ruta correcta. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133
Puedo confirmar que "ruta" no hace nada, pero señalar el comando directamente al binario hace el truco. Esto parece un error en Chef.
FRKT