如何包装通知或订阅厨师食谱



keepalive cookbook中,有这样一个关于keepaalive服务资源的定义:

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]

我在这里找到:https://github.com/chef/chef/blob/78ba88287781667e4aa344bc4ceff280fa7ac466/lib/chef/resource.rb#L316订阅被转换为通知,所以我尝试将通知包装在模板 [keepalived.conf] 上,结果相同,但没有成功;/

任何人都可以帮忙吗?

您无法"覆盖"订阅或通知呼叫。 但是,您可以从通知堆栈中删除它们,但这不是一件好事。 run_context对象具有即时和延迟通知的集合。 你必须解决这个问题,搜索它,并删除有问题的通知。 而且,由于公共 API 中的内容很少,因此每次更新 Chef 时都会有中断的风险。 最好的办法是将 PR 与食谱一起要求将重新启动更改为重新加载,或者至少提供将其更改为重新加载的选项。

我将在这里添加确切的示例:

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

其他提示:

  • 使用notifies_immediatelydelayed_notifications确切的通知类型,

  • subscribes以静默方式转换为目标资源上的notifies,因此您必须始终覆盖正确的notifes对象。

最新更新