3

我正在尝试通过 Vagrant/Chef-solo 构建一个基于 Centos 6.4 并使用 vagrant-omnibus (1.1.2) 的开发框,以确保该框使用最新的 Chef(同时创建/整理食谱,然后我'可能会冻结版本)。目前它安装 11.8.2。

其中一本食谱ruby_build用于安装 Ruby 2.0.0-p353,然后在 /usr/local/bin 下创建符号链接,以便在厨师运行完成后 Ruby 可供所有用户使用。它还安装了一些我想在系统范围内强制安装的 gem。

问题是gem_package在执行后使用资源ruby_build将 gem 安装在 Chef Omnibus 安装的嵌入式 ruby​​ 中。到目前为止,我使用gem_binary强制检测系统范围的 Ruby 环境的选项解决了这个问题,但这让我开始思考,所以我检查了在 Chef 运行期间使用了哪个 PATH(使用 ashell_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

4

2 回答 2

1

答案是:

  1. Vagrant 用于以“vagrant”用户身份ssh登录该框。guest这增加了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_bindirand开头gem_bindir(指的是 Chef Omnibus 安装)。然后,如果不是$PATH已经是的一部分,则附加所有其他健全的路径,这就是为什么/usr/local/bin在最后。

正如 Mark O'Connor 所提到gem_package的,forgem_binary选项可以用于某个 gem。对于其他资源,可以指定完整路径。但是,如果要shell_out!以具有登录 shell 的用户身份执行命令,则首先需要清空环境(enviroment: { 'PATH' => nil }bash -l -c用于执行所需的命令。

于 2013-12-08T10:18:55.993 回答
0

我建议指定目标 ruby​​ 的 gem 命令的路径:

gem_package "mypackage" do
  gem_binary "/path/to/my/ruby/distro/bin/gem"
end
于 2013-12-07T01:55:58.557 回答