Como mesclar variáveis do tipo hash em diferentes arquivos de variáveis em ansible?

1

Eu tenho dois arquivos de variáveis YAML que são reutilizados para vários manuais:

# playbook/group_vars/all

settings:
  a: 1
  b: 2

# inventory/group_vars/main.yml

settings:
  c: 3

Eu quero que settings seja igual a { a: 1, b: 2, c: 3 } em meus manuais.

Em vez disso, é igual a { c: 3 } porque inventory/group_vars/* tem prioridade maior que playbook/group_vars/all e porque os hashes são substituídos , não mesclados .

Eu vejo as seguintes opções:

  • Defina as variáveis separadamente, usando convenções de nomenclatura e prefixos, em vez de usar hashes, da seguinte forma:

    # playbook/group_vars/all
    
    settings_a: 1
    settings_b: 2
    
    # inventory/group_vars/main.yml
    
    settings_c: 3
    

Nossa equipe não considera esta solução elegante o suficiente.

  • Use set_fact e / ou o operador "+" de Jinja

{{ list_common + list_specific }}

Isso requer mudanças em muitos playbooks (nós temos muitos deles) e também parece ruim.

-

Existem outras opções para mesclar hashes de arquivos diferentes em vez de redefinir (substituí-los)?

O que estamos tentando alcançar é parar a duplicação de listas em arquivos de variáveis e definir apenas os parâmetros específicos do grupo / host.

    
por Jason Holcomb 07.03.2018 / 10:56

2 respostas

2

Em primeiro lugar, a lista é [1, 2, 3] e você fala sobre o dicionário {a:1, b:2, c:3} ou, em outras palavras, sobre o hash.

Existe um parâmetro configurável: hash_behaviour .

Por padrão, é replace , mas você pode defini-lo como merge para obter o comportamento desejado.

    
por 07.03.2018 / 13:19
0

Começando com o Ansible v2.0, você pode:

- name: merging hash_a and hash_b into hash_c
  set_fact: hash_c="{{ hash_a|combine(hash_b) }}"

Verifique mais em Filtros Ansible - Combinando hashes / dicionários ( vindo de Jinja2)

    
por 15.10.2018 / 23:56