Chef-Bash-Ressource wird nicht als angegebener Benutzer ausgeführt

11

Ich schreibe ein Kochbuch, um Hubot zu installieren . Im Rezept mache ich folgendes:

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

Wenn ich jedoch versuche, chef-client auf dem Server auszuführen, auf dem das Kochbuch installiert ist, wird mir die Berechtigung verweigert, in das Verzeichnis des Benutzers zu schreiben, der chef-client ausführt, und nicht in den Hubot-Benutzer. Aus irgendeinem Grund npmwird versucht, unter dem falschen Benutzer ausgeführt zu werden, nicht unter dem in der Bash-Ressource angegebenen Benutzer.

Ich kann sudo su - hubot -c "npm install /usr/local/hubot/hubot"manuell ausgeführt werden und erhalte das gewünschte Ergebnis (installiert Hubot als Hubot-Benutzer). Es scheint jedoch, dass Chef-Client den Befehl nicht als Hubot-Benutzer ausführt. Unten finden Sie die Ausführung von Chef-Client. Danke im Voraus.

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
quelle
Moment mal, Sie sagen, Sie führen Chef-Client als Nicht-Root-Benutzer aus?
cjc
Es ist ein Benutzer, der Sudo-Rechte hat. Es ist das gleiche, das ich zum Bootstrapping des Knotens verwendet habe.
Arthur Maltson
Aber du machst "sudo chef-client", oder?
cjc
Sie sollten wahrscheinlich Koch als Wurzel laufen lassen.
Mike Fiedler
Chef läuft als Root-Benutzer.
Arthur Maltson

Antworten:

8

Das Problem ist (wahrscheinlich) nicht, dass Chef den Befehl als falscher Benutzer ausführt, sondern dass die Shell, in der Ihr Skript ausgeführt wird, keine Anmeldeshell ist. Dies bedeutet, dass einige Umgebungsvariablen (wie HOME) nicht wie erwartet festgelegt werden, was dazu führt, dass npm versucht, Dateien an der falschen Stelle zu schreiben.

Das Problem wird in Ausgabe CHEF-2288 erörtert . Während dies noch aussteht, können Sie versuchen, HOME=/home/hubot-userIhren Codeblock hinzuzufügen , bevor npm aufgerufen wird.

zts
quelle
4

Entnommen aus einem Kommentar in CHEF-2288 :

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

Hat für mich gearbeitet!

In deinem Fall:

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

Claptimes
quelle
2
Dies setzt voraus, dass das hubot_userbereits vor dem Chef-Client-Lauf erstellt wurde. Dies liegt daran, dass der Dir.homeBefehl ausgeführt wird, wenn die Datei geladen wird, und nicht, wenn das Rezept ausgeführt wird. Wenn Sie einen neuen Computer erstellen, geschieht dies höchstwahrscheinlich, bevor eines Ihrer Benutzererstellungsrezepte ausgeführt wird, und führt zu einem Fehler.
Russ Bradberry
Für die gestellte Frage funktioniert diese Antwort perfekt.
Schauen Sie
1
nicht auf dem ersten Bootstrap der Maschine, tut es nicht. Dies funktioniert nur, wenn der Benutzer bereits auf dem Computer vorhanden ist.
Russ Bradberry
Ich werde zweitens darauf hinweisen, dass dies keine Lösung ist, wenn der Küchenchef auch den betreffenden Benutzer verwaltet, da dieser Code in der Kompilierungsphase vor jeder Rezeptausführung ausgeführt wird. Es gibt größere Hacks, um es möglicherweise in die zweite Stufe zu schieben, aber ...... 'HOME' => "/ home / # {hubut_user}" zu tun wird funktionieren, da es nur das Übergeben von Strings ist - aber natürlich fehlt das magische Berührung.
scharf
1

Nachher: /server//a/432916/129232

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

 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 .

Skarab
quelle