Chef infra 如何在厨师烹饪手册中包装通知或订阅

Chef infra 如何在厨师烹饪手册中包装通知或订阅,chef-infra,wrapper,cookbook,recipe,Chef Infra,Wrapper,Cookbook,Recipe,在keepalived cookbook中,keepalived服务资源有这样的定义: service "keepalived" do supports :restart => true action [:enable, :start] subscribes :restart, "template[keepalived.conf]" end 这对大多数人来说可能没问题,但我不想在配置发生微小变化时重新启动KeepAlive。重新启动将导致ip从主服务器移动到从服务

在keepalived cookbook中,keepalived服务资源有这样的定义:

service "keepalived" do
    supports :restart => true
    action [:enable, :start]
    subscribes :restart, "template[keepalived.conf]"
end
这对大多数人来说可能没问题,但我不想在配置发生微小变化时重新启动KeepAlive。重新启动将导致ip从主服务器移动到从服务器,以此类推-在CentOS上,这足以重新加载服务

所以我开始在我的食谱中这样包装它:

begin
    r = resources(:service => "keepalived")
    r.supports :restart => true, :reload => true
    r.subscribes :reload, "service[keepalived]"
rescue Chef::Exceptions::ResourceNotFound
    Chef::Log.warn "could not find service to override!"
end
但这称为重新启动然后重新加载服务:

 Recipe: keepalived::default
     - restart service service[keepalived]
     - reload service service[keepalived]
我在这里发现: 订阅被转换为通知,所以我尝试在模板[keepalived.conf]上包装通知,结果相同,但没有成功/

有人能帮忙吗?

您不能“覆盖”订阅或通知呼叫。但是,您可以将它们从通知堆栈中删除,但这不是一件好事。
run\u上下文
对象包含一组即时和延迟通知。你必须找到它,搜索它,然后删除有问题的通知。而且,由于公共API中几乎没有这方面的内容,因此每次更新Chef时,都有可能破坏它。你最好的选择是在食谱中加入一个PR,要求重新启动改为重新加载,或者至少给出将其改为重新加载的选项

我将在此添加确切的示例:

n = run_context.delayed_notifications('template[keepalived.conf]')
n.first.action = :reload
其他提示:

  • 对于确切的通知类型,使用
    立即通知
    延迟通知

  • 订阅
    被静默地转换为目标资源上的
    通知
    ,因此您必须始终覆盖适当的
    通知
    对象


我想您必须将其从资源集中删除,但我不确定如何执行。听起来您可以在
Keepalive
食谱上提出改进请求,或者向他们发送一个包含更改的请求。感谢您的提示-这正是我在您回答之前所做的:-)示例代码如下所示:n=run\u context.delayed\u notifications('template[keepalived.conf]”)n.first.action=:重新加载我同意原始项目的PR将是最好的解决方案,但由于强制需要签署CLA,我现在没有这样做的许可。哦,多痛苦啊。我曾经不得不处理这件事。真烦人。但我很高兴这对你有用。我甚至没有考虑将操作更改为:重新加载而不是删除通知。