合并Chef属性数组

假设我有两本食谱,Foo和Bar。 在cookbook Foo中,attributes / default.rb包含以下内容:

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

在食谱B中,我想用另一个对象(即合并两个数组)来扩展该数组: {:baz => 'C', :qux => 'D'} ,理想情况下来自一个配方。

我试图把下面的酒吧的食谱,或属性文件:

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

期待两者合并,并导致:

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

但是那不是发生了什么。 相反,在Chef-Solo运行期间,只有两个对象中的一个包含在数组中。 我也尝试与default.overridedefault.set具有相同的结果。 我怎样才能合并这两个数组?

谢谢。

如果要将单个哈希元素添加到数组中,可以使用插入运算符<<而不是赋值运算符=来完成

在食谱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,那么你需要防止尝试插入一个还不存在的数组。

在食谱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'} ] 

你可以尝试从第二个配方中使用厨师的DeepMerge方法,如:

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

一个将包含深度合并的哈希!