假设我有两本食谱,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得到相同的结果。如何合并两个数组?
谢谢。
如果要将单个散列元素添加到数组中,可以使用插入运算符 << 而不是赋值运算符 =
在食谱 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)
| 归档时间: |
|
| 查看次数: |
16647 次 |
| 最近记录: |