„wykonać” jako włóczęgowski użytkownik, a nie root, z szefem kuchni solo?

10

Próbuję uruchomić następujące polecenie szefa kuchni:

# 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

Ale ciągle zawodzi, ponieważ nie może znaleźć npm:

Wykonaj [zainstaluj q i zombiejs] (szef-redtail :: domyślna linia 205) miał błąd: Errno :: ENOENT: Brak takiego pliku lub katalogu - npm zainstaluj -gq zombie powinien mocha skrypt skryptowy

vagrant sshRęczne logowanie się do włóczęgi i uruchomienie polecenia działa idealnie. Logowanie się jako root, przez sudo -ii uruchomienie polecenia kończy się niepowodzeniem z tego samego powodu, dla którego przepis szefa kuchni się nie powiedzie (npm jest instalowany lokalnie tylko dla włóczęgi, a nie dla roota: tego właśnie chcę).

Więc ... jak mogę określić ten executeblok szefa kuchni , aby działał jako włóczęga, a nie root?


AKTUALIZACJA : Myślę, że to podsumowuje mój problem:

(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

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


KOLEJNA AKTUALIZACJA : Właśnie zauważyłem tę rozbieżność:

(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

Czy zauważysz różnicę w PATH? Eksport nie ma w nim /home/vagrant/.local/binkatalogu ... dlaczego pierwsze echo miałoby PATHz nim wrócić , a drugi eksport PATHbez niego? Czy to jest problem?

Neezer
źródło

Odpowiedzi:

13

Aby wykonać skrypt lub polecenie jako użytkownik, musisz połączyć su -l i 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

Z powodu niektórych błędów szef kuchni nie ustawia poprawnie środowiska dla określonego użytkownika w trakcie wykonywania . Rozwiązanie narced133 nie będzie działać.

Skarab
źródło
6

Można użyć environmentdo ustawienia zmiennych środowiskowych HOME i USER w bloku wykonawczym.

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

Używam tego często, aby instalować błędne wtyczki jako błędny użytkownik w moich maszynach wirtualnych. Możesz również ustawić inne zmienne środowiskowe, jeśli jest to potrzebne przez dowolne polecenie, które próbujesz wykonać.

Michael Goetz
źródło
To bardzo czysta odpowiedź IMHO.
Ben Liyanage
2

Wygląda na to, że szef kuchni wykonuje się jako włóczęga, ale nie szuka tej samej ŚCIEŻKI, co twoja powłoka. Zaloguj się przy użyciu vagrant sshi uruchom which npm. Zwróci coś takiego /path/to/bin/npm. Zamień /path/to/bin/poniżej, aby zmusić szefa kuchni do przeszukania odpowiedniego katalogu.

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
źródło
Właśnie tego spróbowałem; nie ma kości. Nadal kończy się niepowodzeniem z tym samym błędem w poście. Jakieś inne sugestie?
neezer
Można spróbować skierować polecenie bezpośrednio na dowiązanie symboliczne npm zamiast próbować uzyskać właściwą ścieżkę. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133
Mogę potwierdzić, że „ścieżka” nic nie robi, ale załatwienie polecenia bezpośrednio na plik binarny załatwia sprawę. To wygląda na błąd w szefie kuchni.
FRKT