【问题标题】:chef notify global service from inside of LWRP provider code厨师从 LWRP 提供程序代码内部通知全球服务
【发布时间】:2015-12-06 09:20:04
【问题描述】:

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

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

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

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

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

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

include_recipe "web-server::install" # 创建服务['web-server']

this_cookbook_my_lwrp "sites" do # 这个 LWRP 正在尝试通知服务['web-server']
行动:创建
结束

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

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

此外,定义use_inline_resources 是否会对资源可见性以外的任何其他方面产生影响?

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      类似的东西。

      【讨论】:

        【解决方案3】:

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

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

        您可以将其视为厨师运行中的厨师运行。

        这个想法是能够在 LWRP 内部制作东西并完全抽象它们,LWRP 资源将从其内部资源中获取更新状态,因此 LWRP 声明(配方方)中的通知将通过在 LWRP 内部进行了更改。

        使用use_inline_resources,LWRP内部的资源可以相互通知。 如果没有 use_inline_resources,它们将在收敛阶段而不是在编译时添加到主 run_contextresource_collection,如果 LWRP 定义服务或具有固定名称的资源。

        希望它能让它更清楚一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-26
          • 2014-02-06
          • 2014-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多