是否以cheap-solo的游民身份而非root身份执行“ execute”?


10

我正在尝试运行以下Chef命令:

# install zombiejs, q (promises), should, coffee-script & mocha                 
execute "install q and zombiejs" do                                             
  cwd "/home/vagrant"                                                           
  user "vagrant"                                                                
  action :run                                                                   
  command "npm install -g q zombie should mocha coffee-script"                  
end

但是它一直失败,因为找不到npm

execute [install q and zombiejs](chef-redtail ::默认行205)有错误:Errno :: ENOENT:无此类文件或目录-npm install -gq zombie应该摩卡咖啡脚本

通过vagrant ssh并手动运行命令登录到vagrant可以正常工作。sudo -i以同样的原因,通过厨师主菜谱失败,以root身份登录并通过命令运行失败(npm仅在本地为无业游民用户安装,而不是root用户安装:这就是我想要的)。

那么...我该如何指定该Chef execute块以无业游民的用户身份而不是root用户身份运行?


更新:我认为这总结了我的问题:

(ssh) /vagrant git:backbone ❯ whoami
vagrant

(ssh) /vagrant git:backbone ❯ which npm
/home/vagrant/.local/bin/npm

(ssh) /vagrant git:backbone ❯ echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i which npm
npm not found

通过http://tickets.opscode.com/browse/CHEF-2517


另一个更新:所以我才注意到这种差异:

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i export
HOME=/home/vagrant
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LOGNAME=vagrant
MAIL=/var/mail/vagrant
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
SHELL=/bin/zsh
SSH_AUTH_SOCK=/tmp/ssh-uJUopA4146/agent.4146
SUDO_COMMAND='/bin/zsh -c export'
SUDO_GID=1001
SUDO_UID=1000
SUDO_USER=vagrant
TERM=xterm
USER=vagrant

请注意其中的区别PATH?导出中没有/home/vagrant/.local/bin列出目录...为什么第一个echo PATH随此返回,而第二个echo PATH没有它返回?这是问题吗?

Answers:


13

要以用户身份执行脚本或命令,需要结合使用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中的指定用户正确设置环境。narced133的解决方案不起作用。


6

您可以environment在execute块中用于设置HOME和USER环境变量。

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    environment ({'HOME' => '/home/vagrant', 'USER' => 'vagrant'})                                                             
    command "npm install -g q zombie should mocha coffee-script"                  
end

我经常使用它来在我的VM中以流浪汉用户的身份安装流浪汉插件。您还可以根据需要尝试执行的任何命令设置其他环境变量。


恕我直言,这是一个非常干净的答案。
Ben Liyanage

2

听起来Chef正在作为无业游民的用户执行,但没有搜索与您的shell相同的PATH。使用登录vagrant ssh并运行which npm。它将返回类似/path/to/bin/npm/path/to/bin/在下面替换以强制Chef搜索适当的目录。

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    path ["/path/to/bin/"]                                                               
    command "npm install -g q zombie should mocha coffee-script"                  
end

刚刚尝试过;没有骰子。仍然失败,并在帖子中出现相同的错误。还有其他建议吗?
neezer 2012年

可以尝试将命令直接指向npm符号链接,而不是尝试正确获取路径。command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133

我可以确认“路径”没有任何作用,但是直接将命令指向二进制文件就可以了。这似乎是Chef中的错误。
FRKT 2012年
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.