【问题标题】:How to wrap notifies or subscribes in chef cookbook如何在厨师食谱中包装通知或订阅
【发布时间】:2015-04-30 00:50:36
【问题描述】:

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 subscribes 被转换为 notifies 所以我尝试将通知包装在 template[keepalived.conf] 上,结果相同但没有成功;/

有人可以帮忙吗?

【问题讨论】:

  • 我猜你必须从资源集合中删除它,但我只是不确定,如何做到这一点。
  • 听起来您可以对 keepalived 食谱提出改进请求,或者向他们发送包含更改的拉取请求。

标签: chef-infra wrapper cookbook recipe


【解决方案1】:

您不能“覆盖”订阅或通知呼叫。但是,您可以将它们从通知堆栈中删除,但这并不是一件好事。 run_context 对象有一组即时通知和延迟通知。你必须解决这个问题,搜索它,然后删除有问题的通知。而且,由于公共 API 中很少有这些内容,因此每次更新 Chef 时,您都会冒着破坏它的风险。您最好的选择是在食谱中放入 PR,要求将重新启动更改为重新加载,或者至少提供将其更改为重新加载的选项。

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

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

其他提示:

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

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

【讨论】:

  • 感谢您的提示 - 这正是我在您回答之前所做的 :-) 示例代码如下所示:n = run_context.delayed_notifications('template[keepalived.conf]') n。 first.action = :reload 我同意 PR 到原始项目将是最好的解决方案,但由于强制需要签署 CLA,我现在无权这样做。
  • 哦,真痛苦。曾几何时,我不得不处理这个问题。这很烦人。但我很高兴这对你有用。我什至没有考虑将操作更改为 :reload 与仅删除通知。
猜你喜欢
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多