使用 chef-solo 以 vagrant 用户(而不是 root 用户)身份执行?

使用 chef-solo 以 vagrant 用户(而不是 root 用户)身份执行?

我正在尝试运行以下 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

执行[install q and zombiejs](chef-redtail::default 第 205 行)出现错误:Errno::ENOENT: 没有此文件或目录 - npm install -gq zombie 应该 mocha coffee-script

通过登录 vagrantvagrant ssh并手动运行命令完全没问题。以 root 身份登录,通过sudo -i并运行命令失败,原因与 chef recipe 失败的原因相同(npm 仅为 vagrant 用户本地安装,不为 root 用户安装:这就是我想要的)。

那么...我如何指定这个 chefexecute块以 vagrant 用户而不是 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没有列出目录……为什么第一个 echo 返回时会包含目录,而第二个导出却没有包含目录?这是问题吗?/home/vagrant/.local/binPATHPATH

答案1

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

答案2

您可以使用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

我经常使用它以 vagrant 用户身份在我的虚拟机中安装 vagrant 插件。您还可以根据需要通过尝试执行的任何命令设置其他环境变量。

答案3

听起来 Chef 是以 vagrant 用户身份执行的,但搜索的路径与您的 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

相关内容