回答
出席這個問題,答案在將來可能不熟悉的廚師讀者,廚師運行「收斂」的節點,或在聲明的政策使它的行它正在運行的配方。這也被稱爲「融合」。這有兩個階段,「編譯」和「執行」。編譯階段是當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
還有幾個。
中止或編輯Chef run的推薦方式是引發異常。這裏有一個例子:
ruby_block "some tricky operation" do
block do
OperationFoo
raise "Operation Foo Failed" if some_condition
end
end
廚師:: 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
要廚師獨奏運行期間做不乾淨的退出,試試這個:
throw :end_client_run_early
:
bash 'exit' do
code 'killall -9 chef-solo'
end
當你想chef
一些動作後,完成只需要用下面的語句它將不會出現任何錯誤。
- 1. vagrant跑廚師食譜
- 2. 廚師跑VS廚師系統下 - 不同的寶石回購
- 3. 廚師跑期間的AWS OpsWorks圖層
- 4. 安裝廚師開發工具包後,我跑了「廚師驗證」
- 5. 廚師:廚師,客戶端首先散步代碼執行它
- 6. 如何在沒有廚師服務器的情況下運行廚師(廚師獨奏/廚師零)
- 7. 廚師屬性結構
- 8. 廚師和git結帳
- 9. 如何覆蓋環境中的廚師食譜版本約束?
- 10. 廚師如何檢測廚師是否在Mac上運行?
- 11. 如何使用廚師食譜迭代廚師角色屬性
- 12. 廚師Ohai:如何與gem_package
- 13. 廚師LWRPs - 如何使用
- 14. 廚師 - NoMethodError在廚師::資源::應用
- 15. 廚師:理解廚師::資源提供?
- 16. 如何停止廚師食譜循環中的資源克隆?
- 17. 如何在廚師編譯階段中止當前食譜?
- 18. 如何在廚師中自動化mysql_secure_installation
- 19. 使用廚師運行Windows批處理命令會阻止廚師提供
- 20. 使用廚師
- 21. 與廚師
- 22. 廚師投訴
- 23. 使用廚師
- 24. 廚師LWRP remote_file_notification
- 25. 廚師部署?
- 26. 廚師供應
- 27. 使用廚師
- 28. default_attributes - 廚師
- 29. 廚師和PostgreSQL
- 30. Opscode廚師刀
太棒了!很有幫助。我曾在各種廚師資源中尋找過這一點,但沒有找到它。如果我有,這個問題不存在。最近,我決定,當我搜索一個問題的答案,並沒有找到它或者在Stackoverflow或從預期的資源很容易,一旦我有一個答案,我會放在一起Stackoverflow問題和答案對捕捉我學到了什麼。 –
我從來沒有能夠'救援Net :: HTTPServerException'工作。它不拯救例外。 – Zabba
喜歡西班牙宗教裁判評論:-) – Mamun