インストールするChefクックブック Hubot を書いています。レシピでは、次のことを行います。
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 [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
問題は、(おそらく)Chefが間違ったユーザーとしてコマンドを実行しているのではなく、スクリプトを実行しているシェルがログインシェルではないことです。これは、一部の環境変数(HOMEなど)が期待どおりに設定されず、npmが誤った場所にファイルを書き込もうとすることを意味します。
この問題は issue CHEF-2288 で説明されています。それは未解決のままですが、HOME=/home/hubot-user
は、npmが呼び出される前のコードブロック内です。
CHEF-2288 のコメントから取得:
environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })
私のために働いた!
あなたの場合:
environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })
後: https://serverfault.com/a/432916/129232
スクリプトまたはコマンドをユーザーとして実行するには、su -lと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
いくつかのバグ が原因で、chefはexecuteで指定されたユーザーの環境を適切に設定しません。