我创建了为我解决问题的 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>"]
eg中node["package_version"]["glibc"]
。我让它适用于 5 个平台系列,但对于 Arch,您必须确保已package-query
安装。
重要提示:在执行 Chef 配方之前加载/填充 Ohai。此解决方案不会自动更新 Ohai,因此如果您想访问新安装/升级包的数据,在当前 Chef 运行期间,您必须手动重新加载 Ohai。为此,请将以下块放置在包安装/升级块下的配方中,如下所示:
#example package instalation
package "whatever"
ohai "reload_ohai" do
action :reload
end
感谢@markoconnor。该解决方案基于他指出的社区插件。那些不再在线。我将它们调整为与 Chef 11.0+ 一起使用,它们就在这里。