Chef
使用 Chef 檢查版本
我在幾台伺服器上安裝了一個小應用程序,我想編寫一個快速配方,讓我能夠從這些伺服器收集版本號。
這是我寫的:
bash "Get app version" do code <<-EOH cat /var/lib/myapp/node_modules/myapp/package.json | grep version EOH end
但是,當我執行刀引導命令時,我在控制台中看不到輸出,即使我
-VV
在輸出不存在的情況下執行它也是如此。我有兩個問題:
- 這是我收集版本號的最佳方式嗎?
- 為什麼
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::Log
andreturn
代替不重要的錯誤並且您想繼續處理配方。您可以刪除節點屬性位並僅記錄資訊,以便它出現在 chef-client 日誌中。這比依賴標準輸出/標準錯誤要好一點,標準輸出/標準錯誤會在廚師客戶端沒有互動執行(即作為服務)時消失。但是,當您可以將其儲存在中心位置並查詢您的基礎設施中的值時,為什麼還要記錄它呢?
請注意,如果您認為自己會重新使用 myapp-b 的功能,通常最好在庫中實現 ruby 並通過自定義輕量級資源使用它。