Als vagabundierender Benutzer, nicht als Root, mit Chef-Solo ausführen?

10

Ich versuche, den folgenden Befehl des Küchenchefs auszuführen:

# 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

Aber es scheitert immer wieder, weil es nicht finden kann npm:

Ausführen [q und zombiejs installieren] (chef-redtail :: default line 205) hatte einen Fehler: Errno :: ENOENT: Keine solche Datei oder kein solches Verzeichnis - npm install -gq zombie sollte mokka kaffeeskript

Das Anmelden bei vagrant via vagrant sshund das manuelle Ausführen des Befehls funktioniert einwandfrei. Die Anmeldung als root über sudo -iund das Ausführen des Befehls schlägt aus demselben Grund fehl, aus dem das Rezept des Küchenchefs fehlschlägt (npm wird lokal nur für den vagabundierenden Benutzer installiert, nicht für root: Dies ist das, was ich möchte).

Also ... wie kann ich diesen Chefblock angeben execute, der als vagabundierender Benutzer und nicht als Root ausgeführt werden soll?


UPDATE : Ich denke, das fasst mein Problem zusammen:

(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

über http://tickets.opscode.com/browse/CHEF-2517


EIN ANDERES UPDATE : Also habe ich gerade diese Diskrepanz bemerkt:

(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

Beachten Sie den Unterschied in PATH? Im Export ist das /home/vagrant/.local/binVerzeichnis nicht aufgeführt ... warum würde das erste Echo PATHmit und das zweite Export PATHohne es zurückkehren? Ist das das Problem?

neezer
quelle

Antworten:

13

Um ein Skript oder einen Befehl als Benutzer auszuführen, müssen Sie su -l und bash -i kombinieren :

 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

Aufgrund einiger Fehler legt der Chef die Umgebung für den angegebenen Benutzer bei der Ausführung nicht richtig fest . Die Lösung von narced133 funktioniert nicht.

Skarab
quelle
6

Mit können Sie die environmentUmgebungsvariablen HOME und USER in Ihrem Ausführungsblock festlegen.

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

Ich verwende dies häufig, um Vagrant-Plugins als Vagrant-Benutzer in meinen VMs zu installieren. Sie können bei Bedarf auch andere Umgebungsvariablen für jeden Befehl festlegen, den Sie ausführen möchten.

Michael Goetz
quelle
Dies ist meiner Meinung nach eine sehr saubere Antwort.
Ben Liyanage
2

Es hört sich so an, als würde Chef als vagabundierender Benutzer ausgeführt, aber nicht denselben Pfad wie Ihre Shell durchsucht. Mit anmelden vagrant sshund ausführen which npm. Es wird so etwas wie zurückgeben /path/to/bin/npm. Ersetzen Sie /path/to/bin/unten, um Chef zu zwingen, das entsprechende Verzeichnis zu durchsuchen.

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
quelle
Hab das gerade versucht; kein Würfel. Scheitert immer noch mit dem gleichen Fehler in der Post. Irgendwelche anderen Vorschläge?
Neezer
Könnte versuchen, den Befehl direkt auf den npm-Symlink zu richten, anstatt zu versuchen, den richtigen Pfad zu finden. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133
Ich kann bestätigen, dass "Pfad" nichts bewirkt, aber das direkte Zeigen des Befehls auf die Binärdatei reicht aus. Dies scheint ein Fehler in Chef zu sein.
FRKT