大海厨师长:如何使用新安装的Ruby和gem_软件包

大海厨师长:如何使用新安装的Ruby和gem_软件包,ruby,chef-infra,Ruby,Chef Infra,使用chef我有一个安装gem的简单配方,例如: gem_package "passenger" do version node['passenger']['version'] end 我还想用另一本烹饪书安装ruby,对于某些服务器可能是ruby 1.9.3,对于其他服务器可能是ruby Enterprise 1.8.7。所以我想我可以用gem_binary和ohai来做这个,就像这样: gem_package "passenger" do version node['passeng

使用
chef
我有一个安装gem的简单配方,例如:

gem_package "passenger" do
  version node['passenger']['version']
end
我还想用另一本烹饪书安装ruby,对于某些服务器可能是ruby 1.9.3,对于其他服务器可能是ruby Enterprise 1.8.7。所以我想我可以用
gem_binary
ohai
来做这个,就像这样:

gem_package "passenger" do
  version node['passenger']['version']
  gem_binary "#{languages['ruby']['bin_dir']/gem}"
end
但是问题开始了,因为安装新ruby时,
语言['ruby']
不会改变。Ruby Enterprise安装到
/opt/Ruby Enterprise
中,并通过
/etc/profile.d/ree.sh
将自身添加到
路径,但在同一次运行期间,
ohai
不会拾取该路径,而是在下一次运行中拾取该路径

在第一次运行中,
ohai
表示,当与
vagrant
chef\u solo
一起使用时,
语言['ruby']
安装在
/opt/vagrant\u ruby/bin/ruby
中。乘客gem安装到了错误的ruby中


如何让ohai识别新安装的ruby?

通常我使用的RVM也有同样的问题。在那里,我通常对gem二进制文件的路径进行硬编码,并将最后一位保留为属性

例如

差不多

  5   node["rvm"]["rubies"].each do |ruby|
  6     gem_package "[#{ruby}]-passenger" do
  7       package_name "passenger"
  8       version node[:passenger][:version]
  9       gem_binary "/usr/local/rvm/bin/gem-#{ruby}"
 10       options "--no-ri --no-rdoc"
 11     end
 12   end

或者,我们使用了
bash
块并获取了相应的文件。注意:当使用bash块时,只有块中的最后一件事将用于确定成功与否,通常明智的做法是使用
&

链接它们。我认为有一种方法可以在运行chef recipe期间重新加载ohai属性:

您需要使用ohai资源:

ohai "reload" do
  action :reload
end

查看更多信息:

是否有办法更新ohai自动属性
语言['ruby']['gem_bin']
以查看新安装的gem二进制文件?问题是chef从一开始就编译所有内容,执行ohai:reload不会影响已编译的资源-因此它仍然使用旧的gem二进制文件。我了解了您的问题,可能这一资源可以帮助您:作为资源描述状态:
Ruby Block Ruby\u Block资源可以用于在运行期间执行一点Ruby代码。在聚合过程中,Ruby_块资源中的Ruby代码将与其他资源一起计算,而在配方计算(编译)过程中,Ruby_块资源之外的Ruby代码将在其他资源之前进行计算。
同样,正如您所引用的,Ruby块之外对语言['Ruby']['gem_binary']的所有引用都将在一开始时进行计算,并且不能用写在ruby_块内的代码更改。不要在ruby块外引用语言['ruby']['gem_binary'],然后:)在ruby块内执行。其他希望使用gem_binary安装gem的烹饪书没有ruby块,您是否建议将几十本现成的烹饪书改为使用ruby_块而不是
gem_包