我正在尝试通过Vagrant / Chef-solo构建一个开发盒,基于Centos 6.4并使用vagrant-omnibus(1.1.2)来确保盒子使用最新的Chef(同时创建/组合cookbook,然后我可能会冻结版本)。目前它安装了11.8.2。
其中一本烹饪书使用ruby_build
安装Ruby 2.0.0-p353,然后在/ usr / local / bin下创建符号链接,以便在Chef运行完成后所有用户都可以使用Ruby。它还安装了一些我希望在系统范围内强制执行的安装。
问题是在gem_package
执行后使用ruby_build
资源在Chef Omnibus安装中的嵌入式ruby中安装gem。到目前为止,我使用gem_binary
选项强制检测系统范围的Ruby环境,但它让我思考,所以我检查了在Chef运行期间使用了哪个PATH(使用shell_out
将PATH打印到文件中)并发现它显示以下内容:
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/chef/embedded/bin:/opt/chef/embedded/bin:/usr/local/bin
这是从哪里来的?如何/为什么/opt/chef/embedded/bin
在 /usr/local/bin
之前添加?
答案 0 :(得分:1)
答案是:
Vagrant使用ssh
登录guest
框作为' vagrant'用户。这会添加sshd_config
安全路径。在CentOS 6.4中:
/sbin:/bin:/usr/sbin:/usr/bin
然后它使用sudo
成为' root'用户。该配置文件来源,在CentOS 6.4中,这意味着sbin
路径被添加,而$HOME/bin
被追加。
然后chef-solo
运行并强制执行路径健全。路径健全性在最后添加所有路径(如果不是现有$PATH
的一部分),从ruby_bindir
和gem_bindir
开始(指的是Chef Omnibus安装)。然后,如果不是$PATH
的一部分,则会附加其他所有理智路径,这就是/usr/local/bin
最终的原因。
正如Mark O&Connor所提到的,对于gem_package
,gem_binary
选项可用于某个宝石。对于其他资源,可以指定完整路径。但是对于shell_out!
,如果要以具有登录shell的用户身份执行命令,则首先需要清空环境(enviroment: { 'PATH' => nil }
并使用bash -l -c
来执行所需的命令。
答案 1 :(得分:0)
我建议指定目标ruby的gem命令的路径:
gem_package "mypackage" do
gem_binary "/path/to/my/ruby/distro/bin/gem"
end