2013-01-12 38 views

回答

104

出席這個問題,答案在將來可能不熟悉的廚師讀者,廚師運行「收斂」的節點,或在聲明的政策使它的行它正在運行的配方。這也被稱爲「融合」。這有兩個階段,「編譯」和「執行」。編譯階段是當Chef評估(「編譯」)食譜的Ruby代碼時,尋找要添加到資源收集的資源。一旦完成,它會「執行」每個資源的操作,使其進入所需的狀態。系統命令運行等。

Erik Hollensbe寫了優秀走過how this works in 2013

現在,答案:

有幾種方法來結束一個廚師經營,或退出一個廚師的食譜,這取決於你想如何去了解它,因爲廚師的食譜是Ruby代碼。

如果你的目標是要停止處理基於條件的配方,但繼續運行的其餘部分,然後用return Ruby的關鍵字。例如:

file '/tmp/ponies' do 
    action :create 
end 

return if node['platform'] == 'windows' 

package 'bunnies-and-flowers' do 
    action :install 
end 

我們推測,如果系統是Windows,它不具有可安裝兔子和花卉包裝的軟件包管理器,所以我們回來。

如果你想中止廚師完全運行

有幾個其他的事情可以做。如果主廚在任何地方遇到未處理的例外,廚師將退出。例如,如果一個模板資源找不到它的源文件,或者如果運行Chef的用戶沒有權限去做一個目錄。這就是爲什麼使用raise可以結束運行。

,你把raise事項。如果您在ruby_block資源中使用它,則它只會在執行階段收斂。如果您在上面的return示例之外的資源之外使用它,它將在編譯階段發生。

file '/tmp/ponies' do 
    action :create 
end 

raise if node['platform'] == 'windows' 

package 'bunnies-and-flowers' do 
    action :install 
end 

也許我們在Windows上有一個包管理器,我們希望安裝這個包。加註將導致廚師致命退出並給出堆棧跟蹤。

另一種方法是使用Chef::Application.fatal!。這會將fatal消息記錄到廚師記錄器和STDERR,然後退出應用程序。你也可以給它一個返回碼(也許你有一個腳本來檢查它們?)。

Chef::Application.fatal!("Didn't expect the Spanish Inquistion", 42) if spanish_inquisition 

(當然spanish_inquisition通常是零,因爲沒有人希望它...我離題...)

這將導致Chef退出,發送日誌消息以及進程中的返回碼42。

注意:這會導致整個應用程序退出,如果正在運行的守護進程的服務,它將終止之意,並根據服務是如何管理的,它可能會或可能不會再次啓動。例如,init.d服務將不會重新啓動,但runit服務將會。

由於配方是Ruby,您還可以優雅地處理begin..rescue塊的錯誤情況。

begin 
    dater = data_bag_item(:basket, "flowers") 
rescue Net::HTTPServerException 
    # maybe some retry code here? 
    raise "Couldn't find flowers in the basket, need those to continue!" 
end 

data_bag_item使得對於廚師服務器上的數據包的HTTP請求,並返回一個Net::HTTPServerException如果有來自服務器的問題(404未找到,403授權等)。我們可能會嘗試重試或進行其他處理,然後回退到raise。如果你在命令行運行廚師

報告錯誤

簡單的退出和折騰堆棧跟蹤的罰款。但是,如果你使用cron或者在幾臺甚至幾十臺或幾百臺機器上運行守護進程,當存在問題時,這並不是保持理智的好方法。

輸入Chef's report/exception handler feature。你可以使用你的Chef運行的處理程序。所有報告處理程序都在Chef運行結束時運行。異常處理程序在中止的Chef運行結束時運行。跟蹤運行狀態,並可以在處理程序中進行檢查,以便可以編寫處理兩種運行(成功/已完成或未成功/已中止)的運行狀態。

documentation告訴你如何寫一個。同時還包括open source handlers的列表,您可以使用各種服務,包括:

  • 電子郵件通過SMTP
  • IRC
  • 石墨
  • HipChat

還有幾個。

+2

太棒了!很有幫助。我曾在各種廚師資源中尋找過這一點,但沒有找到它。如果我有,這個問題不存在。最近,我決定,當我搜索一個問題的答案,並沒有找到它或者在Stackoverflow或從預期的資源很容易,一旦我有一個答案,我會放在一起Stackoverflow問題和答案對捕捉我學到了什麼。 –

+1

我從來沒有能夠'救援Net :: HTTPServerException'工作。它不拯救例外。 – Zabba

+0

喜歡西班牙宗教裁判評論:-) – Mamun

7

中止或編輯Chef run的推薦方式是引發異常。這裏有一個例子:

ruby_block "some tricky operation" do 
    block do 
    OperationFoo 
    raise "Operation Foo Failed" if some_condition 
    end 
end 
4

廚師:: Application.fatal!應該做你想要的。這裏是我們的代碼庫的一個例子,可能會有所幫助。

cipher = case key.length 
    when 16 then "AES-128-ECB" 
    when 24 then "AES-192-ECB" 
    when 32 then "AES-256-ECB" 
else 
    Chef::Application.fatal!("AES Key must be 16, 24, or 32 characters in length but key #{key} has length of #{key.length}") 
end 
-3

要廚師獨奏運行期間做不乾淨的退出,試試這個:

throw :end_client_run_early 

bash 'exit' do 
    code 'killall -9 chef-solo' 
end 
-1

當你想chef一些動作後,完成只需要用下面的語句它將不會出現任何錯誤。