我正在使用Apache cookbook来使用2.4 Apache。 Opscode cookbook目前失败,因为它生成的Conffile文件包含从Apache 2.4关键字列表中排除的LockFile关键字。
我想制作一般解决方案,并根据软件版本填充我的conf文件。为此,我必须找出已安装软件的版本。同样的问题一直困扰着我一段时间,但我一直在努力避免它。因为我一遍又一遍,所以我想问:
如果找到已安装的软件包/软件的版本,如果cookbook没有指定它,即安装最新的软件包?
注意:请不要告诉我将命令传递给底层shell。我想知道是否有更好,更健康的方式?也许与Ohai有关的东西?
编辑:似乎我被误解了。我想知道是否有一个抽象平台层的解决方案(就像Ohai一样),我会说gimme_version('apache')
之类的内容并获得已安装的apache版本。我想避免在内部使用特定于平台的代码编写case node['platform_family'] when... when... when
。
答案 0 :(得分:2)
我创建了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>"]
,例如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+合作,在这里它们是。
答案 1 :(得分:1)
对@ Konzula answer的改进避免使用eval。在archlinux上也不需要包查询。它仍然在gentoo上使用equery,如果尚未安装,可以从app-portage / gentoolkit安装。
id_group