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运行结束时运行.跟踪运行的状态,并且可以在处理程序中进行检查,因此您可以编写一个处理两种运行(成功/完成或不成功/中止)的运行状态.
该文件告诉你如何写一个.它还包括可用于各种服务的可用开源处理程序列表,包括:
还有几个.
中止或编辑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)
| 归档时间: |
|
| 查看次数: |
33957 次 |
| 最近记录: |