クックブックにデフォルトの属性があるとしましょう:
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()
をしますか? また、マージしたい優先順位を指定できますか?