2014-09-21 63 views
4

我看到,如果service['somename']被内部LWRP创建了use_inline_resources启用,那么这个资源不是在其他情况下明显的 - 这里说明:Notify service defined in included LWRP recipe厨师从LWRP提供商代码内通知全球服务

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

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

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

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

的顶部。在我的情况我有秘方:

include_recipe “网络服务器安装::” #创建服务[ 'Web服务器']

this_cookbook_my_ lwrp“地王”做#这LWRP试图通知服务[“Web服务器”]
行动:建立

所以这LWRP在这个食谱中定义。而且它的行为是这样的:

  • 如果LWRP包含use_inline_resources,它无法看到服务[ 'Web服务器']
  • 如果LWRP不包含use_inline_resources,就可以看到服务[ 'Web服务器']

此外,是否定义use_inline_resources对其他资源可见性有任何影响?

回答

0

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

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

你可能会看到它作为厨师跑内的厨师。

这个想法是能够在LWRP内部生成内容并完全抽象它们,LWRP资源将从其内部资源中获取更新状态,因此LWRP声明(配方)中的通知将会通过在LWRP内部发生了变化。使用use_inline_resources,LWRP内部的资源可以互相通知。 没有use_inline_resources,他们将被添加到主run_contextresource_collection在收敛pahse,而不是在编译时,它通常以内部通知,没有工作,有时资源的重复,如果LWRP定义具有固定的服务或资源的结束名称。

希望这使得它更有点清楚。

1

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

这是什么要说的是,加入use_inline_resources您LWRP将导致LWRP资源被标记为updated如果有嵌入的资源是updated。这可以让你治疗的LWRP资源作为一个整体,而不是其它资源的集合(这是一个定义是什么)。

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

同样的,如果你LWRP需要访问外部资源来通知它,那么你的LWRP不自足。我假设您的LWRP需要在添加虚拟主机后通知服务资源以便您的网络服务器重新加载?如果是这种情况,那么你就要求你的LWRP做一些它不应该做的事情。您的LWRP负责配置VHOST,但它不负责启动/重新加载网络服务器。同样,您用来安装网络服务器的机制不负责启动它。您声明service资源与启动Web服务器时,那service资源还负责订阅可能需要重新加载发生的任何资源(或这些资源 - 就像你LWRP的情况下 - 应当通知Web服务器)。

mycool_vhost 'some vhost' do 
    attribute value 
    other_attribute value 
end 

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

就是这样的。

2

如果你在寻找办法从LRWP里面,你可以使用以下提供商行动的内部代码通知全球服务:

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