大海厨师长:如何使用新安装的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_包
?