2014-03-04 45 views
2

我正在修改Apache Cookbook以使用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以及平台特定的代码。

+0

不......而Ohai只是运行在引擎盖下的shell命令反正 – sethvargo

+0

烨,但是从上它上面是平台无关的,而这正是我所需要的 - 独立于平台的解决方案。 – Konzula

+0

这就是Ohai的全部观点 - 它运行特定于平台的命令 – sethvargo

回答

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  

下次运行厨师,包版本信息将在node["package_version"]["<package_name>"]例如node["package_version"]["glibc"]。我使它适用于5个平台系列,但对于Arch,您必须确保安装了package-query

重要注意事项:Ohai在Chef食谱执行前加载/填充。此解决方案将而不是自动更新Ohai,所以如果您想要访问新安装/升级包的数据,在当前Chef运行期间,您必须手动重新加载Ohai。要做到这一点,地方下面块你的食谱软件包安装在/升级块,就像如下图所示:

#example package instalation 
package "whatever" 

ohai "reload_ohai" do 
    action :reload 
end 

感谢@markoconnor。这个解决方案基于他指出的社区插件。那些不再在线。我调整了他们与厨师11.0+,他们在这里工作。

+0

@sethvargo,你对这个解决方案有何看法?这些社区插件是否因为一个很好的理由而搬走了,也就是说现在有更好的方法来做到这一点吗? – Konzula

0

@ Konzula的answer避免使用eval的改进。也不需要在archlinux上进行包查询。它仍然使用gentoo上的equery,如果它尚未安装,可以从app-portage/gentoolkit安装。

Ohai.plugin(:PackageVersion) do 
    provides 'package_version' 

    depends 'platform_family' 

    collect_data do 
    list = case platform_family 
      when 'debian' 
      `dpkg-query -W -f='${Package} ${Version}\\n'` 
      when 'rhel' || 'fedora' 
      `rpm -qa --queryformat '%{NAME} %{VERSION}\\n'` 
      when 'arch' 
      `pacman -Q` 
      when 'gentoo' 
      `equery list --format='$name $version' '*'` 
      end 
    package_version Mash[list.lines.map(&:split)] 
    end 
end 
+0

Thanks @Bill :)我很高兴有人看看这段代码。只要我找到一些时间并通过我们接受的答案,我会尽快核实这一点...... – Konzula

相关问题