Допустим, у меня есть атрибут по умолчанию в поваренной книге:
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
в своем шаблоне, когда пытаюсь сделать
<% node.nginx_upstreams.each do |name, servers| %>
Кроме того, я также получаю 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()
, и могу ли я указать ему приоритет, с которым я хочу выполнить слияние?
node.default["key"] = "value"
,node.set["key"] = "value"
иnode.override["key"] = "value"
для приоритета по умолчанию, нормального и переопределения соответственно. - person Igor Serebryany   schedule 01.02.2013