首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >厨师从LWRP供应商代码内部通知全球服务

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

Stack Overflow用户
提问于 2014-09-21 22:44:40
回答 3查看 1.3K关注 0票数 4

我看到,如果service['somename']是在启用use_inline_resources的情况下在LWRP中创建的,那么这个资源在其他上下文中是不可见的--如下所示:Notify service defined in included LWRP recipe

在我的情况下,service['somename']是在普通配方中定义的(而不是在LWRP提供者中)。然后LWRP提供者试图通知此服务。在我的示例中,服务是web服务器,LWRP负责在这个web服务器中创建虚拟主机。

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

所以问题是:use_inline_resources究竟是如何工作的--我不清楚官方的解释(compile.html)。这个解释正好相反--它说:

要确保嵌入的轻量级资源能够通知顶级资源,请将use_inline_resources添加到文件的顶部。

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

include_recipe“web-server::安装”# creates service'web-server‘this_cookbook_my_lwrp“站点”做这个LWRP试图通知服务’web-server‘ 行动:创建 结束

这个LWRP是在这本食谱中定义的。它的表现如下:

  • 如果LWRP包含use_inline_resources,则无法看到服务“‘web server”。
  • 如果LWRP不包含use_inline_resources,它可以看到服务‘’web server‘。

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

EN

回答 3

Stack Overflow用户

发布于 2015-12-06 01:20:04

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

代码语言:javascript
复制
webserver = run_context.parent_run_context.resource_collection.find('service[webserver]')
new_resource.notifies :restart, webserver
票数 2
EN

Stack Overflow用户

发布于 2014-09-23 16:50:17

要确保嵌入的轻量级资源能够通知顶级资源,请将use_inline_resources添加到文件的顶部。

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

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

同样,如果您的LWRP需要访问外部资源来通知它,那么您的LWRP是不自给的。我假设您的LWRP需要通知您的for服务器在添加vhost之后重新加载的服务资源?如果是这样的话,那么你就要求你的LWRP去做一些不该做的事情。您的LWRP负责配置VHOST,但它不负责启动/重新加载the服务器。同样,用于安装for服务器的机制也不负责启动它。您将声明一个service资源来启动您的the服务器,并且service资源还负责订阅可能需要重新加载的任何资源(或者那些资源--类似于LWRP的实例--应该通知the服务器)。

代码语言:javascript
复制
mycool_vhost 'some vhost' do
  attribute value
  other_attribute value
end

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

差不多吧。

票数 1
EN

Stack Overflow用户

发布于 2014-09-22 07:57:44

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

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

你可能会把它看作是厨师跑在厨师跑里面。

其思想是能够使LWRP内部的东西完全抽象出来,LWRP资源将从其内部资源中获取更新状态,因此LWRP声明(配方方)中的通知是LWRP内部发生了一些变化。

使用use_inline_resources,LWRP内部的资源可以相互通知。如果没有use_inline_resources,它们将在会聚pahse而不是编译时添加到主run_contextresource_collection中,如果LWRP定义一个或多个固定名称的服务或资源,它通常会导致内部通知无法工作,有时还会导致资源复制。

希望它能让事情更清楚一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25964635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档