Chef infra 在运行结束时执行任意操作

Chef infra 在运行结束时执行任意操作,chef-infra,Chef Infra,有并没有一种方法可以在chef运行结束时执行脚本,也就是说,同时执行延迟通知(或者,若可能,甚至在延迟通知之后)?模板资源的:通知:delayed标志允许执行此操作,但如果要执行的操作未绑定到任何模板更新,则这并不适合。当然,也可以通过创建一个模板,用一个总是变化的值填充它,并添加一个:notifies属性来破解它,但这确实是一种破解,我希望避免这种情况。像这样的东西会很棒: 执行“foobaz”do 命令“runfoobaz.sh” 措施:延迟运行 结束 现在执行资源中的action属性没有

有并没有一种方法可以在chef运行结束时执行脚本,也就是说,同时执行延迟通知(或者,若可能,甚至在延迟通知之后)?模板资源的
:通知
:delayed
标志允许执行此操作,但如果要执行的操作未绑定到任何模板更新,则这并不适合。当然,也可以通过创建一个模板,用一个总是变化的值填充它,并添加一个
:notifies
属性来破解它,但这确实是一种破解,我希望避免这种情况。像这样的东西会很棒:

执行“foobaz”do
命令“runfoobaz.sh”
措施:延迟运行
结束
现在执行资源中的
action
属性没有这样的选项。

来自Tomasz评论:

由于chef>=12.5,使用处理程序变得简单多了。现在,任何ruby代码都可以在特定事件上执行,并且可以内联在配方中声明,包括运行结束。看

这是创建处理程序以在特定事件上运行某些内容的首选方法(可以是运行结束)


旧答案记录在案,第一段有两个

最好的解决方法是使用
ruby_块
日志
资源在最后通知您的execute

所有资源都可以在更改时发出通知,而不仅仅是模板。所以任何不是幂等性质的资源都可以

另一个选项是使用Chef::Handlers,它在Chef运行结束时运行,即使它在某个地方失败,您可能希望查看一下windows挂起的rebbot处理程序

参见代码

关于处理程序的文档是


编辑以供评论:听起来你想对chef做一些奇怪的事情,知道你想要实现什么或这个命令应该做什么有助于理解并在通知和处理程序之间提出正确的解决方案。

谢谢你的建议!我同意我所做的不是天生适合厨师。我试图在chef运行结束时检查服务的运行状况(仅用于开发设置,而不用于生产)。另一种选择是通过capistrano执行此操作,但这会导致端口配置的一些重复(因为我已经需要在Vagrant文件中转发端口)。因此,最终的解决方案取决于如果使用chef实现,它会有多黑客。当前的解决方案听起来相当粗糙。对于这种验证,可以查看完整堆栈的test kitchen或minitest chef handler,而这一个也是chef::handler非常适合的。它将在Chef完成后运行(或者在Chef开始之前,由您选择),也可以连接到您的报告基础结构。由于Chef
=12.5
,因此使用处理程序变得更加简单。现在,任何ruby代码都可以在特定事件上执行,并且可以内联在配方中声明,包括运行结束。请参阅@Ghilteras,这是因为该处理程序已包含在core chef client中,我将查看此答案是否可以更新,但在答案中包含整个代码将非常容易阅读