2014-01-15 96 views
1

食谱A提供了一个LWRP,我想在食谱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?

+0

这里没有问题。这只是一个人为的例子,并且对于试图实现的东西的解释很差。 – sethvargo

回答

2

这听起来像你想创建现有LWRP的子资源,这样你就不会“包裹”了 - 你“扩展它“。 LWRP语法使得这不太理想,因为资源在运行时动态编译到Ruby类中。

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

+1

詹金斯食谱有一些我想做的事情非常有用的例子(https://github.com/opscode-cookbooks/jenkins/blob/master/libraries/credentials_password.rb)。现有的提供者是外部食谱中的LWRP,那么是否可以用HWRP扩展LWRP? – borntyping

+0

不太容易。您需要弄清楚在运行时动态构建的LWRP的类名。然后你需要使用纯Ruby类来扩展它。这并不容易,并导致一些严重复杂的代码。 – sethvargo

3

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

编辑:好吧,也许看this LWRPthis LWRP往正确的方向多一点(因为我认为这是一个非常常见的LWRPs模式,我没有太多细节)。您可以使用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 
+3

为什么?因为在发布到SO时无法预期阅读文档? ;-) 或者我理解错了什么? – StephenKing

+1

这不是回答者的错,你的问题不清楚:)。我写了一个类似的答案,直到你的评论。也许增加一些额外的例子和澄清你的问题会有所帮助? – sethvargo