La ressource bash de chef ne s'exécute pas en tant qu'utilisateur spécifié

11

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, npmessaie 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
Arthur Maltson
la source
Attendez, vous dites que vous exécutez chef-client en tant qu'utilisateur non root?
cjc
C'est un utilisateur qui a des droits sudo. C'est le même que celui que j'ai utilisé pour amorcer le nœud.
Arthur Maltson
Mais vous faites "sudo chef-client", non?
cjc
Vous devriez probablement exécuter chef en tant que root.
Mike Fiedler
Chef s'exécute en tant qu'utilisateur root.
Arthur Maltson

Réponses:

8

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-userdans votre bloc de code, avant que npm soit appelé.

zts
la source
4

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

Claptimes
la source
2
Cela suppose que le hubot_usera déjà été créé avant l'exécution chef-client. En effet, la Dir.homecommande 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.
Russ Bradberry
Pour la question posée, cette réponse fonctionne parfaitement.
regardez
1
pas sur le premier bootstrap de la machine, ce n'est pas le cas. cela ne fonctionne que si l'utilisateur existe déjà sur la machine.
Russ Bradberry
Je dirai que ce n'est pas une solution si chef gère également l'utilisateur en question car ce code s'exécute dans la phase de compilation, avant toute exécution de recette. il y a de plus gros hacks autour de lui peut-être pour le pousser dans la deuxième étape, mais ...... faire 'HOME' => "/ home / # {hubut_user}" fonctionnera car c'est juste une chaîne qui passe - mais bien sûr il manque touche magique.
vif
1

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:

 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

En raison de certains bogues , chef ne définit pas correctement l'environnement pour l'utilisateur spécifié lors de l' exécution .

Skarab
la source