厨师从LWRP提供商代码内部通知全球服务

时间:2014-09-21 22:44:40

标签: chef

我看到如果在启用了service['somename']的LWRP内创建use_inline_resources,则此资源在其他上下文中不可见 - 如下所述:Notify service defined in included LWRP recipe

我的情况是在正常配方中定义service['somename'](不在LWRP提供程序中)。然后LWRP提供商正在尝试通知此服务。在我的示例中,服务是Web服务器,LWRP负责在此Web服务器中创建虚拟主机。

如果我在该提供程序中使用use_inline_resources,则提供程序内的代码不会看到在全局范围内定义的资源(在常规配方中)。定义此服务的食谱的Cookbook将depends cookbookname添加为metadata.rb

所以问题是:实际上是如何工作的use_inline_resources - 官方解释对我来说并不清楚(http://docs.getchef.com/lwrp_common_inline_compile.html)。这个解释说明了我看到的相反 - 它说:

  

确保嵌入式轻量级资源可以通知   顶级资源将use_inline_resources添加到文件顶部

在我的情况下,我有食谱:

  

include_recipe“web-server :: install”#create service ['web-server']

     

this_cookbook_my_lwrp“sites”do#此LWRP正在尝试通知服务['web-server']
  行动:创造
  结束

所以这个LWRP是在这本食谱中定义的。它的行为如下:

  • 如果LWRP包含use_inline_resources,则无法看到服务['web-server']
  • 如果LWRP不包含use_inline_resources,则可以看到服务['web-server']

此外,定义use_inline_resources对资源可见性的其他任何因素有影响吗?

3 个答案:

答案 0 :(得分:2)

如果您正在寻找从lrwp内部通知全局服务的方法,您可以在提供者操作中使用以下代码:

webserver = run_context.parent_run_context.resource_collection.find('service[webserver]')
new_resource.notifies :restart, webserver

答案 1 :(得分:1)

  

要确保嵌入式轻量级资源可以通知顶级资源,请将use_inline_resource添加到文件顶部

这就是说,如果任何嵌入资源为use_inline_resources,则将updated添加到LWRP将导致LWRP资源被标记为updated。这允许您将LWRP资源视为单个单元,而不是其他资源的集合(这是定义)。

如果您有LWRP外部的资源需要订阅嵌入式资源,那么您的LWRP可能存在设计问题(它要么尝试做太多,要么尝试做太少)。如果您的外部资源可以,它应该订阅LWRP本身,而不是嵌入的资源。

同样,如果您的LWRP需要访问外部资源以通知它,那么您的LWRP不是自包含的。我假设您的LWRP需要通知服务资源,以便在添加vhost后重新加载您的Web服务器?如果是这种情况那么你要求你的LWRP做一些它不该做的事情。您的LWRP负责配置VHOST,但它不负责启动/重新加载Web服务器。同样,用于安装Web服务器的机制不负责启动它。您声明了service资源以启动您的Web服务器,并且service资源还负责订阅可能需要重新加载的任何资源(或者那些资源 - 如LWRP的实例 - 应该通知网络服务器。)

mycool_vhost 'some vhost' do
  attribute value
  other_attribute value
end

service 'mywebserver' do
  subscribes :reload, "mycool_vhost[some vhost]"
end

类似的东西。

答案 2 :(得分:0)

use_inline_resources的主要作用是为LWRP创建一个新的执行上下文。

它使LWRP内的所有资源都在自己的运行上下文中。

你可能会把它看作厨师在厨师面前跑步。

这个想法是能够在LWRP内部完成并完全抽象它们,LWRP资源将从其内部资源获取更新状态,因此LWRP声明(配方方面)中的通知将通过在LWRP内部发生了变化。

使用use_inline_resources,LWRP内部的资源可以相互通知。 如果没有use_inline_resources,它们将被添加到汇聚页面的主run_contextresource_collection而不是编译时,它通常会导致内部通知无法正常工作,有时会导致资源重复,如果LWRP定义具有固定名称的服务或资源。

希望它能让它更加清晰。