El recurso bash del chef no se ejecuta como usuario especificado

11

Estoy escribiendo un libro de cocina Chef para instalar Hubot . En la receta, hago lo siguiente:

bash "install hubot" do
  user hubot_user
  group hubot_group
  cwd install_dir
  code <<-EOH
    wget https://github.com/downloads/github/hubot/hubot-#{node['hubot']['version']}.tar.gz && \
    tar xzvf hubot-#{node['hubot']['version']}.tar.gz && \
    cd hubot && \
    npm install
  EOH
end

Sin embargo, cuando intento ejecutar chef-client en el servidor que instala el libro de cocina, obtengo un permiso denegado para escribir en el directorio del usuario que ejecuta chef-client, no el usuario hubot. Por alguna razón, npmestá intentando ejecutarse con el usuario incorrecto, no el usuario especificado en el recurso bash.

Puedo ejecutarlo sudo su - hubot -c "npm install /usr/local/hubot/hubot"manualmente, y esto obtiene el resultado que quiero (instala hubot como usuario de hubot). Sin embargo, parece que chef-client no está ejecutando el comando como usuario hubot. A continuación encontrará la ejecución chef-cliente. Gracias de antemano.

Saving to: `hubot-2.1.0.tar.gz'

     0K ......                                                100%  563K=0.01s

2012-01-23 12:32:55 (563 KB/s) - `hubot-2.1.0.tar.gz' saved [7115/7115]

npm ERR! Could not create /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! Failed creating the tarball.
npm ERR! couldn't pack /tmp/npm-1327339976597/1327339976597-0.13104878342710435/contents/package to /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! error installing [email protected] Error: EACCES, permission denied '/home/<user-chef-client-uses>/.npm/log'

...

npm not ok
---- End output of "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" ----
Ran "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" returned 1
Arthur Maltson
fuente
Espera, ¿estás diciendo que estás ejecutando chef-client como un usuario no root?
cjc
Es un usuario que tiene derechos de sudo. Es el mismo que utilicé para arrancar el nodo.
Arthur Maltson el
Pero estás haciendo "sudo chef-cliente", ¿verdad?
cjc
Probablemente deberías estar ejecutando chef como root.
Mike Fiedler
Chef se está ejecutando como usuario root.
Arthur Maltson

Respuestas:

8

El problema es (probablemente) que Chef no ejecuta el comando como el usuario incorrecto, sino que el shell que ejecuta su script no es un shell de inicio de sesión. Esto significa que algunas variables de entorno (como HOME) no se establecerán de la manera esperada, lo que lleva a npm a intentar escribir archivos en el lugar incorrecto.

El problema se discute en el número CHEF-2288 . Si bien eso sigue pendiente, puede intentar agregar HOME=/home/hubot-usersu bloque de código antes de invocar npm.

zts
fuente
4

Tomado de un comentario en CHEF-2288 :

environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })

¡Trabajó para mi!

En tu caso:

environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })

claptimes
fuente
2
Esto supone que hubot_userya se ha creado antes de que se ejecute el chef-cliente. Esto se debe a que el Dir.homecomando se ejecuta cuando se carga el archivo, no cuando se ejecuta la receta. Al crear una nueva máquina, lo más probable es que esto ocurra antes de que se ejecute cualquiera de sus recetas de creación de usuarios y provocará un error.
Russ Bradberry
Para la pregunta formulada, esta respuesta funciona perfectamente.
mira
1
no en el primer arranque de la máquina, no lo hace. solo funciona si el usuario ya existe en la máquina.
Russ Bradberry
En segundo lugar, esto no es una solución si el chef también está administrando al usuario en cuestión porque este código se ejecuta en la fase de compilación, antes de la ejecución de cualquier receta. hay hacks más grandes a su alrededor posiblemente para empujarlo a la segunda etapa, pero ... haciendo 'HOME' => "/ home / # {hubut_user}" funcionará ya que solo se trata de pasar cadenas, pero por supuesto carece de toque mágico.
entusiasta
1

Después: /server//a/432916/129232

Para ejecutar un script o un comando como usuario, debe combinar su -l y bash -i , por ejemplo:

 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 .

Skarab
fuente