`execute` 作为 vagrant 用户,而不是 root,使用主厨独奏?

nee*_*zer 11 vagrant

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

# 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
Run Code Online (Sandbox Code Playgroud)

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

执行[安装q和zombiejs](chef-redtail::default line 205)有一个错误:Errno::ENOENT: No such file or directory - npm install -gq Zombie should mocha coffee-script

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

那么......我如何指定这个厨师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
Run Code Online (Sandbox Code Playgroud)

通过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
Run Code Online (Sandbox Code Playgroud)

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

Ska*_*rab 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
Run Code Online (Sandbox Code Playgroud)

由于一些错误,chef 没有在execute 中为指定用户正确设置环境。narced133 的解决方案将不起作用。


小智 7

您可以使用environment在执行块中设置 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
Run Code Online (Sandbox Code Playgroud)

我经常使用它来安装 vagrant 插件作为我的 VM 中的 vagrant 用户。如果您尝试执行的任何命令需要,您还可以设置其他环境变量。


小智 2

听起来 Chef 正在以流浪用户身份执行,但没有搜索与您的 shell 相同的路径。使用登录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
Run Code Online (Sandbox Code Playgroud)