2015-01-21 3 views
0

Два различных файлов в нашем хранилище содержит следующие строки:Объединение два повара атрибуты

# library_cookbook_1/attributes/default.rb 
default[:library_cookbook_1][:foo] = true 
# library_cookbook_2/attributes/default.rb 
default[:library_cookbook_2][:foo] = true 

Я хотел бы объединить оба этих атрибутов. Недостаточно просто установить одно равное другому, потому что они оба используются взаимозаменяемо. Наибольшее беспокойство вызывает то, что кто-то делает эту ошибку:

"environment_json_attributes": { 
    "library_cookbook_1": { 
     "foo": false //Now it's false half of the time... 
    } 
} 

Забыв установить значение обеих переменных в коде является фатальной ошибкой при нашей нынешней структуре. Я хочу объединить атрибуты таким образом, чтобы поддерживать иерархию переопределения, так что если в библиотеке_cookbook_1 есть переопределение уровня роли, но у библиотеки_cookbook_2 есть переопределение уровня среды, шеф-повар будет обрабатывать переопределения, как если бы атрибуты были всего лишь одним атрибутом.

Идеальный код слияния будет выглядеть примерно так:

> node.attributes.debug_value('library_cookbook_1', 'foo') 
{'precedence1' => true, 'precendence3' => false} 
> node.attributes.debug_value('library_cookbook_2', 'foo') 
{'precedence1' => false, 'precendence2' => true} 

> attr_merge(['library_cookbook_1', 'foo'], ['library_cookbook_2', 'foo']) 
> node.attributes.debug_value('library_cookbook_1', 'foo') 
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false} 
> node.attributes.debug_value('library_cookbook_2', 'foo') 
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false} 

> node[:library_cookbook_1][:foo].precedence4 = true 
> node.attributes.debug_value('library_cookbook_2', 'foo') 
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false, 'precedence4' => true} 

В идеале, я хочу, чтобы каждый атрибут будет указателем на то же самое, так что путь, будущие вызовы и задания применяются к обоим.

Теперь очевидным ответом является просто рефакторинг одного из атрибутов. К сожалению, шеф-повар затрудняет реорганизацию атрибутов - у нас есть 10 различных сред, 7 разных ролей, 20 узлов на среду и т. Д. Мы обязательно сделаем ошибку, которая будет проявляться тонко, если мы попытаемся реорганизовать все это.

+1

У вас гораздо больше проблем с тонкостью, если вы попытаетесь сохранить два разных атрибута. Сделайте это правильно, или вы заплатите цену в течение длительного времени. –

ответ

1

Рефакторинг поваренной книги, которая использует атрибуты для использования только одного атрибута. Затем добавьте некоторый код, который, если любой из исходных attrs установлен на что-то другое, кроме nil (или дозорного), которое прерывает работу Chef. Может быть, слегка раздражает в течение первого часа или около того, но вы очень быстро найдете, где установлены старые значения.

В противном случае сделайте поваренную книгу, которая берет один атрибут и устанавливает для нее значение force_override двух старых значений. Это означало бы, что новая ценность всегда будет побеждать, если есть конфликт.

0

Мы уверены, что допустим ошибку, которая будет проявляться тонко, если мы попытаемся реорганизовать все это.

Вам необходимо исправить это первым! Вам нужно иметь достаточное автоматическое тестирование, чтобы иметь уверенность в изменениях. Если вы беспокоитесь о внесении изменений, вы будете увязнуть и никогда не сесть с шеф-поваром.

Использование ChefSpec для быстрого модульного тестирования кода поваренной книги (без применения каких-либо изменений)

Может быть, вам нужно что-то вроде Vagrant или chefdev среды с ВМ, чтобы проверить полностью сходящиеся узлы с вашими новыми поваренных перед вашей реальной среды.

В качестве примечания стороны, вы можете захотеть stay away from roles тоже, в multi окружающая среда настройки.

очевидный ответ просто реорганизовать прочь один из атрибутов

Вы собираетесь не нужно рефакторинга независимо от того, какой метод вы выбрали в качестве шеф-повара не поддерживает то, что вы хотите из коробки.Добавление в неочевидные kludges из страха изменить вещи только в конечном итоге кусает вас позже.

Итак, ваш очевидный ответ будет мой ответ ....

реорганизовать поваренные книги, чтобы использовать один атрибут. Одиночные атрибуты уже precedence.