Chef infra 如何在Chef中获得Poise LWRP之间的通知

Chef infra 如何在Chef中获得Poise LWRP之间的通知,chef-infra,lwrp,Chef Infra,Lwrp,我正试图了解更多关于LWRP的信息,并有一个安装软件包的工作提供商。当配置发生更改时,我一直在尝试通知我的服务,基本上我有以下内容 我可以让runit服务订阅包已安装/配置已更改的通知吗?在解决方案中,是否可以将服务和包分离,即基于观察者而不是通知runit_服务[“abc”]?我曾想过为该服务创建一个单独的提供商,但还没有找到明确的例子 module MyApp class Resource < Chef::Resource include Poise

我正试图了解更多关于LWRP的信息,并有一个安装软件包的工作提供商。当配置发生更改时,我一直在尝试通知我的服务,基本上我有以下内容

我可以让runit服务订阅包已安装/配置已更改的通知吗?在解决方案中,是否可以将服务和包分离,即基于观察者而不是通知runit_服务[“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

干杯

您不应向LWRPs内部的资源发出通知

根据chef版本和
use_inline_resources
的值,您无法通知,因为LWRP中的资源在单独的上下文中聚合

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

您可能需要从
我的应用程序资源重新启动服务,如下所示:

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
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
或者,如果您希望以其他方式工作,您可以使用以下方式:

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
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
通常,subscribe语法可用于避免在每个其他资源中发出通知,可能会有很多通知,因此,如果您的服务主机有多个应用程序,则最容易获得它,因为它将在每次应用程序更改时重新启动,服务中有多个订阅行,而不是每个应用程序中的通知

即:


您不应该从LWRPs中的资源或向LWRPs中的资源发出通知

根据chef版本和
use_inline_resources
的值,您无法通知,因为LWRP中的资源在单独的上下文中聚合

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

您可能需要从
我的应用程序资源重新启动服务,如下所示:

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
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
或者,如果您希望以其他方式工作,您可以使用以下方式:

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
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
通常,subscribe语法可用于避免在每个其他资源中发出通知,可能会有很多通知,因此,如果您的服务主机有多个应用程序,则最容易获得它,因为它将在每次应用程序更改时重新启动,服务中有多个订阅行,而不是每个应用程序中的通知

即:

为了平衡 根据您的需要,您可以通知任何资源,甚至是那些在资源之外的操作。Poise将在子上下文中搜索匹配的资源,直到找到匹配。因此,您可以在
模板上执行
通知
部署修订版
资源,以通知您的
运行服务

此外,
通知块
的作用类似于正常LWRP中的
使用内嵌资源
。因此,如果您的
runit\u服务
订阅了
my\u应用程序
资源,它将在
deploy\u修订版
模板
更新时收到通知

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

根据您的需要,您可以通知任何资源,甚至是那些在资源之外的操作。Poise将在子上下文中搜索匹配的资源,直到找到匹配。因此,您可以在
模板上执行
通知
部署修订版
资源,以通知您的
运行服务

此外,
通知块
的作用类似于正常LWRP中的
使用内嵌资源
。因此,如果您的
runit\u服务
订阅了
my\u应用程序
资源,它将在
deploy\u修订版
模板
更新时收到通知


这就是MWRP(中等权重资源提供者,又名poise)的力量。它让你做一些在普通LWRP中做不到的事情。正如Tensibai在回答中所解释的那样,如果您不使用poise,您就不能在提供商自己的资源堆栈之外通知。我应该将poise排除在标题之外-也很高兴看到非poise解决方案。poise作者通常不再看这个了,但他可能对这一点特别感兴趣。答案完全不同,取决于你是否使用poise。我应该把poise排除在标题之外-也为非poise解决方案感到高兴。poise作者通常不再看这一点,但他可能对这一点特别感兴趣。答案完全不同,取决于你是否使用平衡。