强制/配置Chef Run(Omnibus安装)中的PATH在哪里?

时间:2013-12-06 08:48:42

标签: ruby chef vagrant chef-solo

我正在尝试通过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之前添加

2 个答案:

答案 0 :(得分:1)

答案是:

  1. Vagrant使用ssh登录guest框作为' vagrant'用户。这会添加sshd_config安全路径。在CentOS 6.4中:

    /sbin:/bin:/usr/sbin:/usr/bin

  2. 然后它使用sudo成为' root'用户。该配置文件来源,在CentOS 6.4中,这意味着sbin路径被添加,而$HOME/bin被追加。

  3. 然后chef-solo运行并强制执行路径健全。路径健全性在最后添加所有路径(如果不是现有$PATH的一部分),从ruby_bindirgem_bindir开始(指的是Chef Omnibus安装)。然后,如果不是$PATH的一部分,则会附加其他所有理智路径,这就是/usr/local/bin最终的原因。

  4. 正如Mark O&Connor所提到的,对于gem_packagegem_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