Chef bash资源未以指定用户身份执行


11

我正在写厨师食谱来安装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时,我获得了拒绝写入运行Chef-client用户(而不是hubot用户)用户目录的权限。由于某种原因,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

等一下,您是说要以某些非root用户身份运行Chef-client?
cjc 2012年

这是具有sudo权限的用户。这与我用来引导节点的相同。
亚瑟·马尔森

但是您正在做“ sudo Chef-client”,对吗?
cjc 2012年

您可能应该以root身份运行Chef。
Mike Fiedler

Chef以root用户身份运行。
亚瑟·马尔森

Answers:


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_user已经在Chef-Client运行之前创建了。这是因为该Dir.home命令是在加载文件时运行的,而不是在执行配方时运行的。在创建新计算机时,这很可能在运行任何用户创建配方之前都会导致失败。
罗斯·布拉德贝里

对于所提问题,此答案非常有效。
请看

1
不在计算机的第一个引导程序上,而是没有。仅当用户已经在计算机上时才起作用。
Russ Bradberry

其次,如果Chef还管理有问题的用户,这是一个非解决方案,因为该代码在任何配方执行之前在编译阶段执行。可能会有更多的破解方法将其推入第二阶段,但是......做'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中的指定用户正确设置环境。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.