La risorsa dello chef bash non viene eseguita come utente specificato


11

Sto scrivendo un libro di cucina per installare Hubot . Nella ricetta, faccio quanto segue:

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

Tuttavia, quando provo a eseguire chef-client sul server che installa il ricettario, mi viene negata l'autorizzazione a scrivere nella directory dell'utente che esegue chef-client, non l'utente hubot. Per qualche motivo, npmsta tentando di eseguire l'utente sbagliato, non l'utente specificato nella risorsa bash.

Sono in grado di eseguire sudo su - hubot -c "npm install /usr/local/hubot/hubot"manualmente e questo ottiene il risultato desiderato (installa hubot come utente hubot). Tuttavia, sembra che chef-client non stia eseguendo il comando come utente hubot. Di seguito troverai l'esecuzione chef-client. Grazie in anticipo.

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

Aspetta, stai dicendo che stai eseguendo chef-client come un utente non root?
cjc,

È un utente con diritti sudo. È lo stesso che ho usato per il bootstrap del nodo.
Arthur Maltson,

Ma stai facendo "sudo chef-client", giusto?
cjc

Probabilmente dovresti eseguire lo chef come root.
Mike Fiedler,

Chef è in esecuzione come utente root.
Arthur Maltson,

Risposte:


8

Il problema è (probabilmente) che Chef non esegue il comando come utente errato, ma che la shell che esegue lo script non è una shell di accesso. Ciò significa che alcune variabili di ambiente (come HOME) non verranno impostate come previsto, portando npm a provare a scrivere file nel posto sbagliato.

Il problema è discusso nel numero CHEF-2288 . Sebbene ciò rimanga eccezionale, potresti provare ad aggiungere il HOME=/home/hubot-usertuo blocco di codice, prima che venga invocato npm.


4

Tratto da un commento in CHEF-2288 :

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

Ha funzionato per me!

Nel tuo caso:

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


2
Ciò presuppone che hubot_usersia già stato creato prima dell'esecuzione dello chef-client. Questo perché il Dir.homecomando viene eseguito quando viene caricato il file, non quando viene eseguita la ricetta. Quando si crea una nuova macchina, molto probabilmente ciò avverrà prima che venga eseguita una delle ricette di creazione dell'utente e si verificherà un errore.
Russ Bradberry,

Per la domanda posta, questa risposta funziona perfettamente.
guarda

1
non sul primo bootstrap della macchina, non lo fa. funziona solo se l'utente esiste già sulla macchina.
Russ Bradberry,

In secondo luogo, questa non è una soluzione se chef gestisce anche l'utente in questione perché questo codice viene eseguito in fase di compilazione, prima di qualsiasi esecuzione della ricetta. ci sono hack più grandi attorno a esso, forse per spingerlo nella seconda fase, ma ...... facendo 'HOME' => "/ home / # {hubut_user}" funzionerà dato che sta solo passando la stringa - ma ovviamente manca il tocco magico.
appassionato del

1

Dopo: /server//a/432916/129232

Per eseguire uno script o un comando come utente, è necessario combinare su -l e bash -i , ad esempio:

 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

A causa di alcuni bug , chef non imposta correttamente l'ambiente per l'utente specificato in esecuzione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.