【问题标题】:How to find out version of software package installed on the node?如何查看节点上安装的软件包版本?
【发布时间】:2014-04-06 09:58:12
【问题描述】:

我正在调整 Apache 食谱以使用 2.4 Apache。 Opscode 食谱目前正在失败,因为它正在生成带有 LockFile 关键字的 conf 文件,该关键字从 Apache 2.4 关键字列表中排除。

我想制定一个通用解决方案,并根据软件版本填充我的 conf 文件。为此,我必须找出已安装软件的版本。同样的问题已经困扰了我大约一段时间,但我一直在设法避免它。由于我一遍又一遍地处理它,我想问一下:

如果说明书没有指定,如何找出已安装软件包/软件的版本,即安装最新的可用版本?

注意:请不要告诉我将命令传递给底层 shell。我想知道是否有更好的、更多的……Chefy 方式?也许与 Ohai 有关?

编辑:似乎我被误解了。我想知道是否有抽象平台层的解决方案(就像 Ohai 所做的那样),我会说类似gimme_version('apache') 并获取已安装的 apache 版本。我想避免在 case node['platform_family'] when... when... when 里面写平台特定的代码。

【问题讨论】:

  • 不...而且 Ohai 只是在后台运行 shell 命令
  • 是的,但从上面看它是独立于平台的,这就是我需要的 - 独立于平台的解决方案。
  • 这就是 Ohai 的重点——它运行特定于平台的命令
  • @sethvargo,Mark_O'Connor,抱歉打扰。看来我误解了。我知道 Ohai 是如何运作的。我要求一种 Ruby/Chef 方法,将特定于平台的代码保留在引擎盖下(或以其他方式分离),并使我的食谱变得漂亮、干净且独立于平台。你知道类似的事情吗?谢谢!

标签: chef-infra chef-recipe chef-solo


【解决方案1】:

我创建了 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

重要提示:Ohai 在执行 Chef 配方之前加载/填充。此解决方案不会自动更新 Ohai,因此如果您想访问新安装/升级的软件包的数据,在当前 Chef 运行期间,您必须手动重新加载 Ohai。为此,请将以下块放在您的配方下的软件包安装/升级块下,如下所示:

#example package instalation
package "whatever"

ohai "reload_ohai" do
  action :reload
end

感谢@markoconnor。该解决方案基于他指出的社区插件。那些不再在线。我将它们调整为与 Chef 11.0+ 一起使用,它们就在这里。

【讨论】:

  • @sethvargo,你对这个解决方案有什么看法?这些社区插件是否有充分的理由被移除,即这些天有更好的方法吗?
【解决方案2】:

对@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

【讨论】:

  • 谢谢@Bill :) 我很高兴有人查看了这段代码。我会在找到一些时间并将接受的答案传递给您后立即检查...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2017-01-24
相关资源
最近更新 更多