return
Ruby关键字。例如:file '/tmp/ponies' do
action :create
end
return if platform?('windows')
package 'bunnies-and-flowers' do
action :install
end
raise
。在出现错误情况时,中止Chef运行是最佳实践。raise
也可以结束运行的原因。raise
的位置很重要。如果您将其用于ruby_block
资源中,则仅在收敛阶段的执行阶段中引发。如果您将其用于资源外部,例如上面的return
示例,则会在编译阶段发生。file '/tmp/ponies' do
action :create
end
raise if platform?('windows')
package 'bunnies-and-flowers' do
action :install
end
也许我们在Windows上拥有一个软件包管理器,并且我们希望安装此软件包。如果发生错误,Chef将致命退出并给出堆栈跟踪。
过去几年中,另一种方法是使用Chef :: Application.fatal!
- 就像我在这个答案中写的那样。时代已经改变,这是不推荐的。不要再这样做。如果你正在这样做,请切换到raise
,如上所述,如果你的需求更复杂,请编写自己的异常处理程序(见下文)。
更优雅的错误处理
由于食谱是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
会在Chef服务器上发出一个数据包的HTTP请求,如果服务器有问题(如404未找到、403未授权等),它将返回Net::HTTPServerException
。我们可以尝试重试或进行其他处理,然后退回到raise
。
报告错误
如果您从命令行运行Chef,则简单退出并抛出堆栈跟踪即可。但是,如果您在几台甚至数十台或数百台机器上作为守护程序或cron运行它时,当出现问题时,这不是保持理智的好方法。
进入Chef的报告/异常处理功能。您可以为Chef运行使用处理程序。所有报告处理程序都在Chef运行结束时运行。异常处理程序在中止的Chef运行结束时运行。运行的状态已被跟踪,并且可以在处理程序中进行检查,因此您可以编写一个处理成功/完成或失败/中止的处理程序。
documentation 告诉你如何编写一个。它还包括可用的 open source handlers 列表,您可以用于各种服务,包括:
以及许多其他的。
推荐中止或编辑 Chef 运行的方法是引发异常。以下是一个示例:
ruby_block "some tricky operation" do
block do
OperationFoo
raise "Operation Foo Failed" if some_condition
end
end
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
Chef::Application.fatal!
。请参见:https://github.com/chefspec/chefspec/issues/489#issuecomment-53592637我们还经常遇到由于直接调用“fatal!”而导致的异常处理报告问题。我们无法接受这些问题作为错误,并且不会修复这种方法。规则很快将被添加到foodcritic以警告其使用。您可以将其视为正式的公司建议。 - lamont当您想让chef
在某些操作后完成时,只需使用以下语句:
throw :end_client_run_early
它将不会出现任何错误而退出。
如果要在 chef-solo 运行期间进行异常退出,请尝试以下方法:
bash 'exit' do
code 'killall -9 chef-solo'
end
rescue Net::HTTPServerException
正常工作。它无法捕获异常。 - ZabbaChef::Application.fatal!
方法上添加了删除线。这种方法绝对不能被Chef用户使用,因为它是一个内部API,最终会导致错误。例如,请参见:https://github.com/chefspec/chefspec/issues/489#issuecomment-53592637 - lamontChef::Application.fatal!
的方法 :). 谢谢,Lamont! - jtimberman