web-dev-qa-db-ja.com

Chef属性配列のマージ

2つの料理本、FooとBarがあるとします。クックブックFooでは、attributes/default.rbに以下が含まれています。

default[:test] = [{:baz => 'A', :qux => 'B'}]

クックブックBでは、その配列を別のオブジェクトで拡張します(つまり、2つの配列をマージします):{:baz => 'C', :qux => 'D'}、理想的にはレシピ内から。

次のバーのレシピまたは属性ファイルを配置しようとしました:

default[:test] = [{:baz => 'C', :qux => 'D'}]

2つがマージされ、次の結果になることを期待します。

node[:test] == [{:baz => 'A', :qux => 'B'}, {:baz => 'C', :qux => 'D'}]

しかし、それは起こりません。代わりに、Chef-Soloの実行中は、2つのオブジェクトのうち1つだけが配列に含まれます。また、default.overridedefault.setを試したところ、同じ結果が得られました。 2つのアレイをマージするにはどうすればよいですか?

ありがとう。

3
Joseph S.

個々のハッシュ要素を配列に追加する場合は、代入演算子=の代わりに挿入演算子<<を使用して行うことができます。

クックブックA

# Create the default attribute as an array
default[:test]=[{:baz => 'A', :qux => 'B'}]

クックブックB

# Using array insertion on an existing array
default[:test] << {:baz => 'C', :qux => 'D'}



ランリストの順序がA、Bであることが保証されていない場合は、まだ存在しない配列に挿入しようとしないようにする必要があります。

クックブックA

default[:test] ||= []
default[:test] << {:baz => 'A', :qux => 'B'}

クックブックB

default[:test] ||= []
default[:test] << {:baz => 'C', :qux => 'D'}



2つの配列をマージする場合は、+ =を使用します

# In cookbook A
default[:test]=[{:baz => 'A', :qux => 'B'}]

# In cookbook B
default[:test] += [ {:baz => 'C', :qux => 'D'}, {:baz => 'E', :qux => 'F'} ]
5
Tricky

次のような2番目のレシピ内からChefのDeepMergeメソッドを使用してみることができます。

a = Chef::Mixin::DeepMerge.merge(node[:test], [ (new array here) ])

ディープマージされたハッシュが含まれます!