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

时间:2015-04-24 12:28:34

标签: chef wrapper cookbook recipe

keepalived 食谱中,有 keepalived 服务资源的定义:

service "keepalived" do
    supports :restart => true
    action [:enable, :start]
    subscribes :restart, "template[keepalived.conf]"
end

对于大多数人来说可能没问题,但是如果配置发生微小变化,我不想重新启动 keepalived 。重启会导致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] 上包含通知,结果相同但没有成功; /

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

你无法覆盖"订阅或通知电话。但是,您可以将它们从通知堆栈中删除,但这不是一件好事。 run_context对象包含立即和延迟通知的集合。你必须得到它,搜索它,并删除违规通知。而且,由于公共API中的内容很少,因此每次更新Chef时都会有风险。你最好的选择是在食谱中放入PR,要求重新启动重新加载,或者至少可以选择将其更改为重新加载。

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

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

其他提示:

  • 使用notifies_immediatelydelayed_notifications获取确切类型的notyfication,

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