Переопределение атрибутов в рецепте
Позволять'скажем, у меня есть атрибут по умолчанию в кулинарной книге:
default.nginx_upstreams = {
'service1' => ['service1.server.com'],
'service2' => ['service2.server.com'],
}
Затем он изменяется и переопределяется в ролях и средах, пока, наконец, не дойдет до моего рецепта. Там я вычисляю некоторые дополнительные сервисы, которые я хотел бы добавить к атрибуту. Если я сделаю что-то вроде этого:
node.nginx_upstreams.merge! {'service3' => ['service3.server.com']}
затем, когда я пытаюсь использовать атрибут в моем шаблоне, я получаюundefined method 'each' for nil:NilClass
в моем шаблоне, когда я пытаюсь сделать
Плюс я тоже получаюWARN: Setting attributes without specifying a precedence is deprecated and will be removed in Chef 11.0
, Полезное предупреждение говорит мне, как установить атрибуты с нормальным приоритетом (по-видимому, используяnode.set["key"] = "value"
, но не делаетРасскажите, как задать атрибуты по умолчанию или переопределить.
Я могу обойти эту проблему, сделав что-то вроде этого:
upstreams = node.nginx_upstreams.to_hash
upstreams.merge! {'service3' => ['service3.server.com']}
template "nginx_config" do
variables({:upstreams=>upstreams})
end
но это похоже на взлом. Я не могу найти документацию поnode.set()
заэта страницаЭто также означает, что вы можете установить в рецепте как обычные, так и переопределенные атрибуты, но нене могу сказать как.
Итак ... как правильно установить атрибуты (которые объединяются вместе со всем остальным) из рецепта? Что этоnode.set()
вызов на самом деле сделать, и я могу сказать ему приоритет, в котором я хочу слиться?