【问题标题】:Execute an arbitrary action at the end of chef run在厨师运行结束时执行任意操作
【发布时间】:2018-10-04 16:15:49
【问题描述】:

有没有办法在厨师运行结束时执行脚本,即延迟通知(或者,如果可能,甚至在它们之后)?带有:delayed 标志的模板资源的:notifies 允许执行此操作,但如果您要执行的操作未绑定到任何模板更新,则这并不适合。当然,可以通过创建模板并使用始终更改的值填充它并添加 :notifies 属性来破解它,但这真的很hacky,我想避免这种情况。像这样的东西会很棒:

execute "foobaz" do
  command "runfoobaz.sh"
  action :delayed_run
end

目前执行资源中的action 属性没有这样的选项。

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    来自 Tomasz 的评论:

    从 chef >=12.5 开始,使用处理程序变得更加简单。任何 ruby​​ 代码现在都可以在特定事件上执行,并在配方内声明,包括运行结束。见https://docs.chef.io/dsl_handler.html

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


    前两段的旧答案记录在案。

    最好的解决方法是使用ruby_blocklog 资源在结束时通知您的执行。

    所有资源都可以通知它们是否发生更改,而不仅仅是模板。所以任何本质上不是幂等的资源都可以。

    另一种选择是使用在厨师运行结束时运行的 Chef::Handlers,即使它在某处失败,您可能希望查看 windows 挂起的 rebbot 处理程序。

    见代码HERE

    关于处理程序的文档是HERE

    编辑备注:听起来你想对厨师做一些奇怪的事情,知道你想要实现什么或这个命令应该做什么可以帮助理解和提出通知和处理程序之间的正确解决方案。

    【讨论】:

    • 感谢您的建议!我同意我正在尝试做的事情并不适合厨师。我正在尝试在厨师运行结束时检查服务的运行状况(仅用于开发设置 - 不适用于生产)。另一种选择是通过 capistrano 执行此操作,但这会导致端口配置重复(因为无论如何我已经需要在 Vagrantfile 中转发端口)。所以最终的解决方案取决于如果用厨师实现它会变得多么hacky。当前的解决方案听起来很老套。
    • 对于这种验证,请查看完整堆栈的测试厨房或 minitest 厨师处理程序HERE 和这个HERE
    • Chef::Handler 非常适合。它会在 Chef 完成之后运行(或者在 Chef 启动之前,由您选择),并且也可以连接到您的报告基础架构中。
    • 自从 chef >=12.5 使用处理程序变得更加简单。任何 ruby​​ 代码现在都可以在特定事件上执行,并在配方内声明,包括运行结束。见docs.chef.io/dsl_handler.html
    • @Ghilteras 那是因为这个处理程序已经包含在核心厨师客户端中,我会看看这个答案是否可以更新,但是在答案中包含整个代码将非常容易阅读
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2016-01-08
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多