`exécuter` en tant qu'utilisateur vagabond, pas root, avec chef-solo?

10

J'essaie d'exécuter la commande chef suivante:

# install zombiejs, q (promises), should, coffee-script & mocha                 
execute "install q and zombiejs" do                                             
  cwd "/home/vagrant"                                                           
  user "vagrant"                                                                
  action :run                                                                   
  command "npm install -g q zombie should mocha coffee-script"                  
end

Mais il continue d'échouer car il ne peut pas trouver npm:

exécuter [installer q et zombiejs] (chef-redtail :: ligne par défaut 205) avait une erreur: Errno :: ENOENT: Aucun fichier ou répertoire - npm install -gq zombie devrait moka coffee-script

Se connecter à vagrant via vagrant sshet exécuter la commande manuellement fonctionne parfaitement bien. La connexion en tant que root, via sudo -iet en exécutant la commande échoue pour la même raison que la recette du chef échoue (npm est installé localement uniquement pour l'utilisateur vagabond, pas pour root: c'est ce que je veux).

Alors ... comment puis-je spécifier ce executebloc chef à exécuter en tant qu'utilisateur vagabond et non root?


MISE À JOUR : Je pense que cela résume mon problème:

(ssh) /vagrant git:backbone ❯ whoami
vagrant

(ssh) /vagrant git:backbone ❯ which npm
/home/vagrant/.local/bin/npm

(ssh) /vagrant git:backbone ❯ echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i which npm
npm not found

via http://tickets.opscode.com/browse/CHEF-2517


UNE AUTRE MISE À JOUR : Je viens de remarquer cette différence:

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i export
HOME=/home/vagrant
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LOGNAME=vagrant
MAIL=/var/mail/vagrant
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
SHELL=/bin/zsh
SSH_AUTH_SOCK=/tmp/ssh-uJUopA4146/agent.4146
SUDO_COMMAND='/bin/zsh -c export'
SUDO_GID=1001
SUDO_UID=1000
SUDO_USER=vagrant
TERM=xterm
USER=vagrant

Remarquez la différence dans PATH? L'export ne contient pas le /home/vagrant/.local/binrépertoire répertorié ... pourquoi le premier écho reviendrait- PATHil avec lui et le second retour d'exportation PATHsans lui? Est-ce là le problème?

neezer
la source

Réponses:

13

Pour exécuter un script ou une commande en tant qu'utilisateur, vous devez combiner su -l et bash -i :

 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 . La solution de narced133 ne fonctionnera pas.

Skarab
la source
6

Vous pouvez utiliser environmentpour définir les variables d'environnement HOME et USER dans votre bloc d'exécution.

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    environment ({'HOME' => '/home/vagrant', 'USER' => 'vagrant'})                                                             
    command "npm install -g q zombie should mocha coffee-script"                  
end

Je l'utilise fréquemment pour installer des plugins vagabonds en tant qu'utilisateur vagabond dans mes machines virtuelles. Vous pouvez également définir d'autres variables d'environnement si nécessaire par la commande que vous essayez d'exécuter.

Michael Goetz
la source
Ceci est une réponse très claire à mon humble avis.
Ben Liyanage
2

Il semble que Chef s'exécute en tant qu'utilisateur vagabond mais ne recherche pas le même CHEMIN que votre shell. Connectez-vous en utilisant vagrant sshet exécutez which npm. Cela retournera quelque chose comme /path/to/bin/npm. Remplacez /path/to/bin/ci-dessous pour forcer Chef à rechercher le répertoire approprié.

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    path ["/path/to/bin/"]                                                               
    command "npm install -g q zombie should mocha coffee-script"                  
end
narced133
la source
J'ai juste essayé ça; pas de dé. Échoue toujours avec la même erreur dans le message. D'autres suggestions?
neezer
Pourrait essayer de pointer la commande directement sur le lien symbolique npm plutôt que d'essayer d'obtenir le bon chemin. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133
Je peux confirmer que "chemin" ne fait rien, mais pointer la commande directement vers le binaire fait l'affaire. Cela semble être un bug dans Chef.
FRKT