我正在调整 Apache 食谱以与 2.4 Apache 一起使用。 Opscode Cookbook 目前失败,因为它正在生成带有 LockFile 关键字的 conf 文件,该关键字被排除在 Apache 2.4 关键字列表之外。
我想制定一个通用解决方案,并根据软件版本填充我的conf文件。为此,我必须找出已安装软件的版本。同样的问题已经困扰我一段时间了,但我一直在设法避免它。由于我一遍又一遍地重复这个问题,我想问:
如果说明书没有指定,即安装最新的可用版本,如何找出已安装的软件包/软件的版本?
注意:请不要告诉我将命令传递给底层 shell。我想知道是否有更好、更...Chefy的方法?也许与欧海有关?
编辑:看来我被误解了。我想知道是否有一个抽象平台层的解决方案(就像 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
下次运行 Chef 时,软件包版本信息将位于node["package_version"]["<package_name>"]
e.g. node["package_version"]["glibc"]
。我让它适用于 5 个平台系列,但对于 Arch,你必须确保你有package-query
安装。
重要的提示:Ohai 在 Chef 菜谱执行之前加载/填充。该解决方案将not自动更新 Ohai,因此如果您想访问新安装/升级的软件包的数据,在当前 Chef 运行期间,您必须手动重新加载 Ohai。为此,请将以下块放置到包安装/升级块下的配方中,如下所示:
#example package instalation
package "whatever"
ohai "reload_ohai" do
action :reload
end
感谢@markoconnor。他指出,这个解决方案基于社区插件。那些已经不在线了。我将它们调整为与 Chef 11.0+ 一起使用,它们就在这里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)