指定されたユーザーとして実行されていないシェフbashリソース


11

HubotをインストールするChef cookbookを書いています。レシピでは、次のことを行います。

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

ただし、クックブックをインストールするサーバーでchef-clientを実行しようとすると、hubotユーザーではなく、chef-clientを実行するユーザーのディレクトリへの書き込みが拒否されます。何らかの理由npmで、bashリソースで指定されたユーザーではなく、間違ったユーザーで実行しようとしています。

私はsudo su - hubot -c "npm install /usr/local/hubot/hubot"手動で実行することができ、これは私が望む結果を得ます(hubotユーザーとしてhubotをインストールします)。ただし、chef-clientはhubotユーザーとしてコマンドを実行していないようです。以下に、chef-clientの実行を示します。前もって感謝します。

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 hubot@2.1.0 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

ちょっと待って、あなたはchef-clientをroot以外のユーザーとして実行していると言っていますか?
cjc

sudo権限を持つユーザーです。これは、ノードのブートストラップに使用したものと同じです。
アーサーモルトソン

しかし、あなたは「sudo chef-client」をやっていますよね?
cjc

おそらくルートとしてchefを実行する必要があります。
マイクフィードラー

Chefはrootユーザーとして実行されています。
アーサーモルトソン

回答:


8

問題は(おそらく)Chefが間違ったユーザーとしてコマンドを実行しているのではなく、スクリプトを実行しているシェルがログインシェルではないことです。これは、いくつかの環境変数(HOMEなど)が期待どおりに設定されず、npmが間違った場所にファイルを書き込もうとすることを意味します。

この問題は、CHEF-2288の問題で説明されています。これは未解決のままですがHOME=/home/hubot-user、npmが呼び出される前にコードブロックを追加してみてください。


4

CHEF-2288のコメントから引用:

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

私のために働いた!

あなたの場合:

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


2
これは、hubot_userchef-clientの実行前にが既に作成されていることを前提としています。これはDir.home、レシピの実行時ではなく、ファイルのロード時にコマンドが実行されるためです。新しいマシンを作成するとき、これはほとんどの場合、ユーザー作成レシピのいずれかが実行される前であり、失敗に終わります。
ラスブラッドベリー

質問に対して、この回答は完全に機能します。
外観

1
マシンの最初のブートストラップではなく、そうではありません。ユーザーがマシン上にすでに存在する場合にのみ機能します。
ラスブラッドベリー

シェフが問題のユーザーも管理している場合、このコードはレシピの実行前にコンパイル段階で実行されるため、これは非解決策です。おそらくそれを第2段階にプッシュするための大きなハックがありますが、......文字列を渡すだけなので、「HOME」=>「/ home /#{hubut_user}」を実行しても機能します-もちろん魔法のタッチ。
鋭い

1

後:https : //serverfault.com/a/432916/129232

ユーザーとしてスクリプトまたはコマンドを実行するには、su -lbash -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

いくつかのバグのため、chefはexecuteで指定されたユーザーの環境を適切に設定しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.