你如何中止/结束厨师运行?

Jor*_*son 52 chef-infra continuous-deployment

在某些情况下,我需要中止/结束一个非零状态代码的Chef运行,然后通过我们的部署链传播回来,最终传给Jenkins,导致一个大而肥胖的红球.

做这个的最好方式是什么?

jti*_*man 111

对于将来可能不熟悉Chef的问题和答案的读者,Chef会运行"收敛"节点,或者使其与正在运行的配方中声明的策略一致.这也称为"收敛".这有两个阶段,"编译"和"执行".编译阶段是Chef评估("编译")食谱的Ruby代码,寻找要添加到资源集合的资源.完成后,它会"执行"每个资源的操作,使其进入所需的状态.系统命令运行等

埃里克Hollensbe写了一个极好的通过步行是如何工作的在2013年.

现在,为了答案:

根据你想要的方式,有几种方法可以结束Chef运行或退出Chef配方,因为Chef配方是Ruby代码.

如果您的目标是根据条件停止处理配方,但继续运行其余部分,则使用returnRuby关键字.例如:

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

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

package 'bunnies-and-flowers' do
  action :install
end
Run Code Online (Sandbox Code Playgroud)

我们假设如果系统是Windows,它没有可以安装bunnies-and-flowers软件包的软件包管理器,所以我们返回.

如果你想彻底中止厨师的运行

您还可以做其他一些事情.如果在Chef运行的任何地方遇到未处理的异常,Chef将退出.例如,如果模板资源找不到其源文件,或者运行Chef的用户没有权限执行诸如创建目录之类的操作.这就是使用raise作品结束运行的原因.

你把raise事情放在哪里.如果在raise资源中使用它,它只会在执行阶段收敛.如果您在资源之外使用它,ruby_block如上例所示,它将在编译阶段发生.

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

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

package 'bunnies-and-flowers' do
  action :install
end
Run Code Online (Sandbox Code Playgroud)

也许我们在Windows上有一个包管理器,我们希望安装这个包.加薪将导致厨师致命退出并给出堆栈跟踪.

另一种方法是使用return.这会将Chef::Application.fatal!消息记录到Chef记录器和STDERR,然后退出应用程序.你也可以给它一个返回码(也许你有一个检查那些的脚本?).

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
Run Code Online (Sandbox Code Playgroud)

(当然raise通常没有,因为没有人期待它......我离题......)

这将导致Chef退出,发送日志消息以及来自进程的返回代码42.

注意:这会导致整个应用程序退出,这意味着如果它作为守护程序服务运行,它将终止,并且根据服务的管理方式,它可能会也可能不会再次启动.例如,begin..rescue服务不会重新启动,但data_bag_item服务会重启.

由于配方是Ruby,您还可以使用Net::HTTPServerException块优雅地处理错误条件.

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

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

package 'bunnies-and-flowers' do
  action :install
end
Run Code Online (Sandbox Code Playgroud)

raise在Chef服务器上为数据包发出HTTP请求,cron如果服务器出现问题(404未找到,403未授权等),则返回a .我们可能会尝试重试或进行其他处理,然后再回过头来return.

报告错误

如果您从命令行运行Chef,只需退出并抛出堆栈跟踪即可.但是,如果您在cron中运行它,或者作为守护程序在几台甚至几十台或几百台机器上运行,那么在遇到问题时这不是保持理智的好方法.

输入Chef的报告/异常处理程序功能.您可以为Chef运行使用处理程序.所有报告处理程序都在Chef运行结束时运行.异常处理程序在中止Chef运行结束时运行.跟踪运行的状态,并且可以在处理程序中进行检查,因此您可以编写一个处理两种运行(成功/完成或不成功/中止)的运行状态.

文件告诉你如何写一个.它还包括可用于各种服务的可用开源处理程序列表,包括:

  • 通过SMTP发送电子邮
  • IRC
  • 石墨
  • HipChat

还有几个.

  • 真棒的答案!很有帮助.我曾在各种Chef资源中寻找过这个,但没有找到它.如果我有,这个问题将不存在.最近,我决定,当我搜索问题的答案并且没有在Stackoverflow上找到它或者很容易从预期的资源中找到它时,一旦我得到了答案,我会把Stackoverflow问题和答案对组合起来以捕获我学到的东西. (2认同)
  • 喜欢西班牙的调查评论:-) (2认同)

Jor*_*son 7

中止或编辑Chef运行的推荐方法是引发异常.这是一个例子:

ruby_block "some tricky operation" do
  block do
    OperationFoo
    raise "Operation Foo Failed" if some_condition
  end
end
Run Code Online (Sandbox Code Playgroud)