假设我有两本食谱,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.override和default.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) ])
一个将包含深度合并的哈希!