假设我有两本食谱,Foo 和 Bar。在食谱 Foo 中,attributes/default.rb 包含以下内容:
default[:test] = [{:baz => 'A', :qux => 'B'}]
在菜谱 B 中,我想用另一个对象扩展该数组(即合并两个数组):,{:baz => 'C', :qux => 'D'}
最好是在菜谱内部。
我尝试放入以下 Bar 的配方,或者属性文件:
default[:test] = [{:baz => 'C', :qux => 'D'}]
预计两者合并将产生以下结果:
node[:test] == [{:baz => 'A', :qux => 'B'}, {:baz => 'C', :qux => 'D'}]
但事实并非如此。相反,在 Chef-Solo 运行期间,数组中只包含两个对象中的一个。我也尝试了和,default.override
结果default.set
相同。我该如何合并这两个数组?
谢谢。
答案1
如果要将单个哈希元素添加到数组中,可以使用插入运算符 << 而不是赋值运算符 =
在食谱 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'}
如果你想合并两个数组,只需使用 +=
# In cookbook A
default[:test]=[{:baz => 'A', :qux => 'B'}]
# In cookbook B
default[:test] += [ {:baz => 'C', :qux => 'D'}, {:baz => 'E', :qux => 'F'} ]
答案2
您可以尝试在第二个菜谱中使用 Chef 的 DeepMerge 方法,例如:
a = Chef::Mixin::DeepMerge.merge(node[:test], [ (new array here) ])
a 将包含深度合并的哈希!