如何在Chef中的Poise LWRP之间收到通知

时间:2015-09-15 21:38:47

标签: chef lwrp

我试图了解有关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

干杯!

2 个答案:

答案 0 :(得分:3)

您不应该通知LWRP内部的资源。

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

但是,如果LWRP内的资源已更新,则LWRP将标记为已更新,并可通知资源。

您可能需要notificationmy_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

答案 1 :(得分:1)

For Poise

根据the poise documentation您可以通知任何资源,甚至是资源操作之外的资源。 Poise将在子上下文中搜索匹配的资源,直到找到匹配为止。因此,您可以在notifiestemplate资源上执行deploy_revision,以通知您的runit_service

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

这是MWRP的力量(中等重量资源提供商,又称平衡)。它让你做一些你在普通LWRP中无法做到的事情。正如Tensibai在他的回答中解释的那样,如果你没有使用poise,你就不能在提供者自己的资源堆栈之外通知。