厨师LWRP

时间:2015-05-10 11:19:28

标签: ruby chef lwrp

我有以下问题,我认为是因为我不了解Chef LWRPs中的变量范围。

您可以在https://github.com/jkleinlercher/chef_problems查看食谱,只需测试厨房的行为。

即使我定义了以下非常相似的资源,我也认识到,属性'颜色'继承自先前定义的资源。属性'颜色'被默认为" ['蓝色']"在提供者中,元素' magenta'被添加到数组中。但是,第二个和第三个资源从先前的资源继承整个数组。这对我来说很奇怪......

recipes / default.rb中的资源定义:

chef_problems_problem1 "test1" do
     address "myaddress1"
     action :install
end

chef_problems_problem1 "test2" do
     address "myaddress2"
     action :install
end

chef_problems_problem1 "test3" do
    address "myaddress3"
    action :install
end

在厨房汇合的输出中,您会看到变量new_resource.colors继承了以前资源的值:

     * chef_problems_problem1[test1] action install
   new_resource.colors at the beginning: ["blue"]

   Values of local variables:
   address: myaddress1
   colors: ["blue"]

   adding magenta to local variable colors

   colors after adding magenta: ["blue", "magenta"]
   new_resource.colors at the end: ["blue", "magenta"]


     * chef_problems_problem1[test2] action install
   new_resource.colors at the beginning: ["blue", "magenta"]

   Values of local variables:
   address: myaddress2
   colors: ["blue", "magenta"]

   adding magenta to local variable colors

   colors after adding magenta: ["blue", "magenta", "magenta"]
   new_resource.colors at the end: ["blue", "magenta", "magenta"]


     * chef_problems_problem1[test3] action install
   new_resource.colors at the beginning: ["blue", "magenta", "magenta"]

   Values of local variables:
   address: myaddress3
   colors: ["blue", "magenta", "magenta"]

   adding magenta to local variable colors

   colors after adding magenta: ["blue", "magenta", "magenta", "magenta"]
   new_resource.colors at the end: ["blue", "magenta", "magenta", "magenta"]

也许你可以帮我找到问题所在。

1 个答案:

答案 0 :(得分:0)

看起来默认值会传递给每个新资源,但不会为每个新资源进行克隆。因此,数组(不是它的内容)是默认值。如果向此数组添加内容,则应使用默认属性值的每个提供程序都具有完整数组。

就个人而言,它认为这是一种意想不到的行为。我认为你会传递每个新资源的默认克隆,但这似乎不是这里的情况。现在,如果您将新数组传递给资源定义中的color属性,那么您将看不到相同的效果。

然而,这不是范围问题。这是一个如何将默认值传递给每个新资源实例的问题。

约翰内斯的更新:

事实证明,此问题已在https://tickets.opscode.com/browse/CHEF-4608中讨论过但未修复。您可以使用此故障单中描述的变通方法,或者只是在提供程序操作中创建一个新数组,如

colors = Array.new(new_resource.colors)

然后使用新数组,不要触摸原始属性。