Chef

使用 Chef 檢查版本

  • April 20, 2020

我在幾台伺服器上安裝了一個小應用程序,我想編寫一個快速配方,讓我能夠從這些伺服器收集版本號。

這是我寫的:

bash "Get app version" do
   code <<-EOH
   cat /var/lib/myapp/node_modules/myapp/package.json | grep version
   EOH
end

但是,當我執行刀引導命令時,我在控制台中看不到輸出,即使我-VV在輸出不存在的情況下執行它也是如此。

我有兩個問題:

  1. 這是我收集版本號的最佳方式嗎?
  2. 為什麼cat結果沒有出現在我的控制台中?

將版本號保存為節點屬性。這樣,您就有了版本的中央儲存,您可以輕鬆地在 Chef 的其他地方使用 node 屬性。

就像是:

ruby_block "myapp installed version check" do
 block do
   # file setup
   file = "/var/lib/myapp/node_modules/myapp/package.json"
   raise "File doesn't exist [#{file}]" unless File.exists?( file )

   # get the version line
   versions = open( file ).grep(/version/)
   raise "No versions in file [#{file}]" unless versions.length > 0
   Chef::Log.warn "Too many versions [#{versions.length}] in file [#{file}]" unless versions.length == 1

   # some regex to match your version number
   version = versions[0].match(/\d+\.\d+/).to_s

   # set the attribute
   node.set[:installed][:myapp][:version] = version

   # optionally reload node so attribute is available during this chef-client run
   node.from_file( run_context.resolve_attribute('myapp-cookbook', 'default') )

   # and log it. 
   Chef::Log.info( "myapp version is [#{node[:installed][:myapp][:version]}]" )
 end
end

raise將導致 Chef 執行失敗並出現異常。使用Chef::Logandreturn代替不重要的錯誤並且您想繼續處理配方。

您可以刪除節點屬性位並僅記錄資訊,以便它出現在 chef-client 日誌中。這比依賴標準輸出/標準錯誤要好一點,標準輸出/標準錯誤會在廚師客戶端沒有互動執行(即作為服務)時消失。但是,當您可以將其儲存在中心位置並查詢您的基礎設施中的值時,為什麼還要記錄它呢?

請注意,如果您認為自己會重新使用 myapp-b 的功能,通常最好在中實現 ruby​​ 並通過自定義輕量級資源使用它。

引用自:https://serverfault.com/questions/531788