合并 Chef 属性数组

Jos*_* S. 4 chef chef-solo

假设我有两本食谱,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.overridedefault.set得到相同的结果。如何合并两个数组?

谢谢。

Tri*_*cky 6

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

在食谱 A

# Create the default attribute as an array
default[:test]=[{:baz => 'A', :qux => 'B'}]
Run Code Online (Sandbox Code Playgroud)

在食谱 B

# Using array insertion on an existing array
default[:test] << {:baz => 'C', :qux => 'D'}
Run Code Online (Sandbox Code Playgroud)



如果不能保证运行列表顺序是 A,B,那么您需要防止尝试插入尚不存在的数组。

在食谱 A

default[:test] ||= []
default[:test] << {:baz => 'A', :qux => 'B'}
Run Code Online (Sandbox Code Playgroud)

在食谱 B

default[:test] ||= []
default[:test] << {:baz => 'C', :qux => 'D'}
Run Code Online (Sandbox Code Playgroud)



如果要合并 2 个数组,只需使用 +=

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

# In cookbook B
default[:test] += [ {:baz => 'C', :qux => 'D'}, {:baz => 'E', :qux => 'F'} ]
Run Code Online (Sandbox Code Playgroud)