合并 Chef 属性数组

合并 Chef 属性数组

假设我有两本食谱,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 将包含深度合并的哈希!

相关内容