如何找出节点上安装的软件包版本?

时间:2014-03-04 17:45:08

标签: chef chef-recipe chef-solo

我正在使用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

2 个答案:

答案 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