我正在修改Apache食谱以与2.4 Apache一起使用。Opscode Cookbook当前失败,因为它正在生成带有LockFile关键字的conf文件,该文件被排除在Apache 2.4关键字列表之外。
我想提出一个通用的解决方案,并根据软件版本填充conf文件。为此,我必须找出已经安装的软件的版本。这个问题已经困扰我一段时间了,但是我一直在努力避免它。由于我要一遍又一遍地讨论它,所以我想问:
如果Cookbook没有指定版本,即安装最新的可用版本,该如何查找已安装的软件包/软件的版本?
注意:请不要告诉我将命令传递给底层shell。我想知道是否还有更好,更...厨师的方式?也许与Ohai有关的东西?
编辑:似乎我被误解了。我想知道是否有一种解决方案可以抽象化平台层(就像Ohai一样),我会说类似的东西gimme_version('apache')
并获取已安装的apache版本。我想避免在其中编写case node['platform_family'] when... when... when
平台特定的代码。
我创建了Ohai插件来为我解决问题。将以下代码放入.rb文件中,然后将该文件放入ohai/plugin/linux
文件夹中。(由于平台和安装类型的不同,无法提供绝对路径)
Ohai.plugin(:PackageVersion) do
provides "package_version"
depends "platform_family"
collect_data do
pckg_list = Hash.new
case platform_family
when 'debian'
pckg_list = eval '{'+`dpkg-query -W -f='"${Package}"=> "${Version}", '`+'}'
when 'rhel' || 'fedora'
pckg_list = eval '{'+`rpm -qa --queryformat '"%{NAME}"=> "%{VERSION}", '`+'}'
when 'arch'
pckg_list = eval '{'+`package-query -Q -f '"%n"=> "%v", '`+'}'
when 'gentoo'
pckg_list = eval '{'+`equery list --format='"$name" => "$version", ' '*'`+'}'
end
package_version Mash.new pckg_list
end
end
您运行厨师接下来的时间,包版本信息将在node["package_version"]["<package_name>"]
如node["package_version"]["glibc"]
。我使它适用于5个平台系列,但对于Arch,则必须确保已package-query
安装。
重要说明:Ohai是在执行厨师配方之前加载/填充的。该解决方案不会自动更新Ohai,因此,如果您要访问新安装/升级的软件包的数据,则在当前Chef运行期间,必须手动重新加载Ohai。为此,请将以下代码块放在您的配方的软件包安装/升级代码块下,如下所示:
#example package instalation
package "whatever"
ohai "reload_ohai" do
action :reload
end
感谢@markoconnor。他指出,该解决方案基于社区插件。这些不再在线。我调整了它们以与Chef 11.0+一起使用,现在就可以了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句