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 hubot@2.1.0 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

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.


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 })


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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.