我看到如果在启用了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是在这本食谱中定义的。它的行为如下:
use_inline_resources
,则无法看到服务['web-server'] use_inline_resources
,则可以看到服务['web-server'] 此外,定义use_inline_resources
对资源可见性的其他任何因素有影响吗?
答案 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_context
和resource_collection
而不是编译时,它通常会导致内部通知无法正常工作,有时会导致资源重复,如果LWRP定义具有固定名称的服务或资源。
希望它能让它更加清晰。