【问题标题】:How to get notifications between Poise LWRP in Chef如何在 Chef 中的 Poise LWRP 之间获取通知
【发布时间】:2015-09-21 22:16:52
【问题描述】:

我正在尝试了解有关 LWRP 的更多信息,并有一个安装包的工作提供程序。当配置更改时,我一直试图通知我的服务 - 基本上我在下面有这个。

我可以让 runit 服务订阅软件包已安装/配置更改的通知吗?在解决方案中,可以解耦服务和包,即。基于观察者而不是通知 runit_service["abc"] ?我想为该服务创建一个单独的提供者,但还没有找到明确的例子。

module MyApp

  class Resource < Chef::Resource
         include Poise
         provides(:my_app)
         actions(:enable)
  end

  class Provider < Chef::Provider
        include Poise
        provides(:my_app)

        def action_enable 
           notifying_block do

             template new_resource.database_config do 
                source 'database.erb'
                #how to notify runit?
             end

             deploy_revision new_resource.process_id do
                #how to notify runit?
             end
           end
        end
   end
end

在食谱中

my_app 'one' do
  #some attributes
  process_user 'nobody'
  process_group 'nogroup'

end


runit_service "myapp" do
  cookbook "myapp" 
  run_template_name "myapp"
  log_template_name "myapp"
  options({
    :app_env => "development",
    :app_home => "/srv/myapp/current",
    :data_dir => "/srv/myapp/data"
  })
  retries 3
  retry_delay 5
end

干杯!

【问题讨论】:

  • 我应该在标题中去掉 Poise - 也为非平衡的解决方案感到高兴。
  • 风度翩翩的作者一般不看这个了,但他可能对这个特别感兴趣。
  • 根据你是否使用平衡,答案完全不同。

标签: chef-infra lwrp


【解决方案1】:

您不应从 LWRP 内的资源发出通知。

根据主厨版本和 use_inline_resources 的值,您无法通知,因为 LWRP 内的资源在单独的上下文中融合。

但是,如果 LWRP 中的某个资源已更新,则 LWRP 将被标记为已更新并可以通知资源。

您可能有一个notification 来从您的my_app resource 重新启动服务,如下所示:

my_app 'one' do
  #some attributes
  process_user 'nobody'
  process_group 'nogroup'
  notifies :restart,"runit_service[myapp]" # adapt action and may use timer :immediately, see the doc link above 
end

或者,如果您希望以其他方式工作,可以使用 subscribe 方式,如下所示:

runit_service "myapp" do
  cookbook "myapp" 
  run_template_name "myapp"
  log_template_name "myapp"
  options({
    :app_env => "development",
    :app_home => "/srv/myapp/current",
    :data_dir => "/srv/myapp/data"
  })
  retries 3
  retry_delay 5
  subscribes :restart,"my_app[one]" # again adapt action and may use timer :immediately, see the doc link above
end

通常订阅语法对于避免在其他资源中通知很有用,可能有很多,所以如果您的服务托管多个应用程序,最简单的方法是让它在每次应用程序更改时重新启动,并在服务中使用多个订阅行而不是每个应用程序中的通知。

即:

runit_service "tomcat" do 
  [...]
  subscribe :restart,"my_app[one]"
  subscribe :restart,"my_app[two]"
  subscribe :restart,"my_app[three]"
end

【讨论】:

    【解决方案2】:

    为了平衡

    根据the poise documentation你可以通知任何资源,甚至是那些在资源之外的动作。 Poise 将在子上下文中搜索匹配的资源,直到找到匹配项。因此,您可以在您的templatedeploy_revision 资源上执行notifies,这将通知您的runit_service

    此外,notifying_block 的行为类似于普通 LWRP 中的use_inline_resources。因此,如果您的 runit_service 订阅了 my_app 资源,那么如果 deploy_revisiontemplate 更新,它将收到通知。

    这就是 MWRP(中等重量资源提供者,又名平衡)的力量。它可以让你做你在普通 LWRP 中做不到的事情。正如 Tensibai 在他的回答中解释的那样,如果您不使用平衡,则无法在提供者自己的资源堆栈之外进行通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多