Zasób bash szefa kuchni nie jest wykonywany jako określony użytkownik

11

Piszę książkę kucharską szefa kuchni, aby zainstalować Hubota . W przepisie wykonuję następujące czynności:

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

Jednak gdy próbuję uruchomić klienta-klienta na serwerze instalującym książkę kucharską, otrzymuję odmowę dostępu do zapisu w katalogu użytkownika, który uruchamia klienta-klienta, a nie użytkownika hubota. Z jakiegoś powodu npmpróbuje uruchomić pod niewłaściwym użytkownikiem, a nie użytkownikiem określonym w zasobie bash.

Jestem w stanie uruchomić sudo su - hubot -c "npm install /usr/local/hubot/hubot"ręcznie, a to daje wynik, który chcę (instaluje hubot jako użytkownik hubot). Wygląda jednak na to, że szef-klient nie wykonuje polecenia jako użytkownik hubota. Poniżej znajduje się wykonanie szefa-klienta. Z góry dziękuję.

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
źródło
Poczekaj, mówisz, że prowadzisz szefa kuchni jako klienta innego niż root?
cjc
To użytkownik, który ma prawa sudo. To ten sam, którego użyłem do ładowania węzła.
Arthur Maltson,
Ale robisz „sudo szefa kuchni”, prawda?
cjc
Prawdopodobnie powinieneś być szefem kuchni jako root.
Mike Fiedler
Szef kuchni działa jako użytkownik root.
Arthur Maltson

Odpowiedzi:

8

Problem polega (prawdopodobnie) na tym, że szef kuchni nie uruchamia polecenia jako niewłaściwy użytkownik, ale że powłoka uruchamiająca skrypt nie jest powłoką logowania. Oznacza to, że niektóre zmienne środowiskowe (np. HOME) nie zostaną ustawione w oczekiwany sposób, co spowoduje, że npm spróbuje zapisać pliki w niewłaściwym miejscu.

Problem omówiono w numerze CHEF-2288 . Chociaż pozostaje to nierozstrzygnięte, możesz spróbować dodać HOME=/home/hubot-userswój blok kodu przed wywołaniem npm.

zts
źródło
4

Na podstawie komentarza w CHEF-2288 :

environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })

Pracował dla mnie!

W Twoim przypadku:

environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })

claptimes
źródło
2
Zakłada się, że hubot_userzostał on utworzony przed uruchomieniem szefa-klienta. Wynika to z faktu, że Dir.homepolecenie jest uruchamiane podczas ładowania pliku, a nie podczas wykonywania receptury. Podczas tworzenia nowego komputera najprawdopodobniej nastąpi to przed uruchomieniem dowolnego przepisu dotyczącego tworzenia użytkownika i zakończy się niepowodzeniem.
Russ Bradberry
W przypadku zadanego pytania ta odpowiedź działa idealnie.
patrz
1
nie przy pierwszym ładowaniu komputera, tak nie jest. działa tylko wtedy, gdy użytkownik już istnieje na komputerze.
Russ Bradberry,
Po drugie, nie jest to rozwiązanie, jeśli szef kuchni zarządza również danym użytkownikiem, ponieważ ten kod jest wykonywany w fazie kompilacji, przed wykonaniem jakiejkolwiek receptury. są dookoła większe hacki, które mogą przesunąć go do drugiego etapu, ale ...... robienie „HOME” => "/ home / # {hubut_user}" będzie działać, ponieważ to tylko przekazywanie ciągów - ale oczywiście brakuje magiczny dotyk.
zapalony
1

Po: /server//a/432916/129232

Aby wykonać skrypt lub polecenie jako użytkownik, musisz połączyć su -l i bash -i , np .:

 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 .

Skarab
źródło