Mesclar matrizes de atributos do Chef

3

Digamos que eu tenha dois livros de receitas, Foo e Bar. No livro de receitas Foo, o atributo / default.rb contém o seguinte:

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

No livro de receitas B, eu gostaria de expandir esse array com outro objeto (ou seja, mesclar os dois arrays): {:baz => 'C', :qux => 'D'} , idealmente de dentro de uma receita.

Eu tentei colocar a seguinte receita do Bar ou o arquivo de atributos:

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

Esperando que os dois sejam mesclados e resultem em:

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

Mas isso não é o que acontece. Em vez disso, apenas um dos dois objetos está contido no array durante uma execução do Chef-Solo. Eu também tentei com default.override e default.set com os mesmos resultados. Como posso mesclar as duas matrizes?

Obrigado.

    
por Joseph S. 04.03.2013 / 16:26

2 respostas

5

Se você quiser adicionar elementos hash individuais a um array, poderá fazê-lo usando o operador de inserção < < em vez do operador de atribuição =

No livro de receitas A

# Create the default attribute as an array
default[:test]=[{:baz => 'A', :qux => 'B'}]

No livro de receitas B

# Using array insertion on an existing array
default[:test] << {:baz => 'C', :qux => 'D'}



Se a ordem da lista de tarefas não for garantida como A, B, então você precisa se prevenir de tentar inserir em uma matriz que ainda não existe.

No livro de receitas A

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

No livro de receitas B

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



Se você quiser mesclar duas matrizes, use + =

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

# In cookbook B
default[:test] += [ {:baz => 'C', :qux => 'D'}, {:baz => 'E', :qux => 'F'} ]
    
por 26.07.2014 / 03:15
0

Você pode tentar usar o método DeepMerge do Chef de dentro da segunda receita como:

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

a irá conter os hashes de fusão profunda!

    
por 05.03.2013 / 01:05