J'écris un livre de cuisine Chef pour installer Hubot . Dans la recette, je fais ce qui suit:
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
Cependant, lorsque j'essaie d'exécuter chef-client sur le serveur installant le livre de recettes, j'obtiens une autorisation refusée d'écrire dans le répertoire de l'utilisateur qui exécute chef-client, pas l'utilisateur hubot. Pour une raison quelconque, npm
essaie de s'exécuter sous le mauvais utilisateur, pas l'utilisateur spécifié dans la ressource bash.
Je peux exécuter sudo su - hubot -c "npm install /usr/local/hubot/hubot"
manuellement, et ceci obtient le résultat que je veux (installe hubot en tant qu'utilisateur hubot). Cependant, il semble que chef-client n'exécute pas la commande en tant qu'utilisateur hubot. Ci-dessous, vous trouverez l'exécution chef-client. Merci d'avance.
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
Réponses:
Le problème n'est (probablement) pas que Chef exécute la commande en tant que mauvais utilisateur, mais que le shell exécutant votre script n'est pas un shell de connexion. Cela signifie que certaines variables d'environnement (comme HOME) ne seront pas définies comme vous le souhaitez, ce qui amènera npm à essayer d'écrire des fichiers au mauvais endroit.
Le problème est abordé dans le numéro CHEF-2288 . Bien que cela reste en suspens, vous pouvez essayer d'ajouter
HOME=/home/hubot-user
dans votre bloc de code, avant que npm soit appelé.la source
Tiré d'un commentaire dans CHEF-2288 :
environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })
A travaillé pour moi!
Dans ton cas:
environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })
la source
hubot_user
a déjà été créé avant l'exécution chef-client. En effet, laDir.home
commande est exécutée lorsque le fichier est chargé, et non lorsque la recette est exécutée. Lors de la création d'une nouvelle machine, cela se produira probablement avant l'exécution de vos recettes de création d'utilisateur et entraînera un échec.Après: /server//a/432916/129232
Pour exécuter un script ou une commande en tant qu'utilisateur, vous devez combiner su -l et bash -i , par exemple:
En raison de certains bogues , chef ne définit pas correctement l'environnement pour l'utilisateur spécifié lors de l' exécution .
la source