【问题标题】:How can I write a Chef provider that extends an existing provider?如何编写扩展现有提供程序的 Chef 提供程序?
【发布时间】:2014-01-16 20:55:31
【问题描述】:

Cookbook A 提供了一个 LWRP,我想用 Cookbook B 中的 LWRP 或 HWRP 对其进行扩展,以便我可以执行以下操作,其中 provider_b 将使用 provider_a 中的现有代码/资源并接受它可以用于自己的操作的其他属性:

provider_a "A" do
    attr_from_a :value
end

provider_b "B" do
    attr_from_a :value
    attr_from_b :value
end

这可能吗?如果我想避免编辑食谱 A,是否还有可能?

【问题讨论】:

  • 这里没有问题。这只是一个带有人为示例的陈述,并且对试图实现的目标的解释很差。

标签: ruby chef-infra chef-recipe


【解决方案1】:

我认为文档中关于Custom LWRPs 的部分和最后链接的tutorial 应该对您有所帮助。

编辑:好的,也许看看this LWRP 或this LWRP 会朝着正确的方向发展(因为我认为这是 LWRP 的一个非常常见的模式,我没有详细介绍)。您可以使用new_resource.param_a访问参数。

所以这样的事情应该可以工作:

action :install do
  provider_a "A" do
    param_a new_resource.param_a
  end

  provider_b "B" do
    param_a new_resource.param_a
    param_b new_resource.param_b
  end
end

【讨论】:

  • 为什么要投反对票?因为发布到 SO 时不能期望阅读文档? ;-) 或者我理解错了什么?
  • 您的问题不清楚不是回答者的错:)。在您发表评论之前,我正在写一个类似的答案。也许为您的问题添加一些额外的示例和说明会有所帮助?
【解决方案2】:

听起来您正在尝试创建现有 LWRP 的子资源,因此您不是在“包装”它,而是在“扩展它”。 LWRP 语法使这不太理想,因为资源在运行时被动态编译成 Ruby 类。

您可以切换到 HWRP(新的 Jenkins cookbook 是一个很好的例子,它使用继承和 OO 来扩展资源和共享属性)。就其本质而言,LWRP 的可扩展性不是很高,因为它们是在运行时动态重建和重新加载的。

【讨论】:

  • jenkins 食谱有一些非常有用的例子来说明我想做的事情 (github.com/opscode-cookbooks/jenkins/blob/master/libraries/…)。现有提供程序是外部说明书中的 LWRP,那么是否可以使用 HWRP 扩展 LWRP?
  • 不是很容易。您需要找出 LWRP 的类名,它是在运行时动态构建的。然后您需要使用纯 Ruby 类对其进行扩展。这并不容易,并且会导致一些非常复杂的代码。
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多