Переменная область действия в LWRP шеф-повара
У меня есть следующая проблема, и я думаю, что это потому, что я не понимаю области переменных в LWRP Chef.
Вы можете посмотреть кулинарную книгу по адресу https://github.com/jkleinlercher/chef_problems и просто проверить поведение на кухне.
Несмотря на то, что я определил следующие очень похожие ресурсы, я понял, что атрибут 'colors' наследует от ранее определенных ресурсов. Атрибут 'colors' по умолчанию равен "['blue']", и в провайдере элемент '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 ответ
Может показаться, что значение по умолчанию передается каждому новому ресурсу, но не клонируется для каждого нового ресурса. В результате массив (не его содержимое) является значением по умолчанию. Если вы добавите вещи в этот массив, можно ожидать, что у каждого провайдера, использующего значение атрибута по умолчанию, будет полный массив.
Лично мне кажется, что это несколько неожиданное поведение. Я бы подумал, что вы передадите каждому новому ресурсу клон по умолчанию, но здесь это не так. Теперь, если вы передадите новый массив атрибуту color в определении ресурса, вы не увидите того же эффекта.
Это, однако, не является проблемой объема. Вопрос в том, как значение по умолчанию передается каждому новому экземпляру ресурса.
Обновление от Йоханнеса:
Оказалось, что эта проблема уже обсуждалась в https://tickets.opscode.com/browse/CHEF-4608 но не была устранена. Вы можете использовать обходной путь, описанный в этом билете, или просто создать новый массив в действии провайдера, например
colors = Array.new(new_resource.colors)
а затем работайте с новым массивом и не трогайте исходный атрибут.