2014-03-04 90 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

相關問題