Mesclando variáveis ​​no Ansible com funções

Mesclando variáveis ​​no Ansible com funções

Estou configurando meu ambiente através do seguinte:

inventário.yml

all:
  children:
    production:
      1.2.3.4
    staging:
      1.2.3.5

Em group_vars/all.yml estou configurando um hash de usuários que será adicionado em um playbook. Gostaria de poder adicionar usuários especificamente a group_vars/staging.yml que seriam mesclados com a mesma configuração em meu group_vars/all.yml.

Existe uma maneira correta de mesclar o hash ou declarar uma herança neste caso?

Responder1

VerDEFAULT_HASH_BEHAVIOUR. Citando

"Essa configuração controla como as variáveis ​​são mescladas no Ansible. Por padrão, o Ansible substituirá as variáveis ​​em ordens de precedência específicas, conforme descrito em Variáveis. Quando uma variável de precedência mais alta vence, ela substituirá o outro valor. Alguns usuários preferem que variáveis ​​que sejam hashes (também conhecidos como 'dicionários' em termos de Python) são mesclados. Esta configuração é chamada de 'mesclagem'.

Por exemplo, dado o inventário egrupo_vars

shell> cat hosts
all:
  children:
    production:
      hosts:
        1.2.3.4
    staging:
      hosts:
        1.2.3.5
shell> cat group_vars/all.yml
users:
  admin:
    shell: /bin/bash
  ansible:
    shell: /bin/sh
shell> cat group_vars/production/users.yml 
users:
  dealer:
    shell: /usr/sbin/nologin
shell> cat group_vars/staging/users.yml 
users:
  tester:
    shell: /bin/bash

O manual

shell> cat pb.yml
- hosts: all
  tasks:
    - debug:
        var: users

por padrão substitui os dicionários. Dá (resumido)

shell> ansible-playbook pb.yml

TASK [debug] ****
ok: [1.2.3.4] => 
  users:
    dealer:
      shell: /usr/sbin/nologin
ok: [1.2.3.5] => 
  users:
    tester:
      shell: /bin/bash

QuandoANSIBLE_HASH_BEHAVIOURestá configurado para mesclar os dicionários fornecidos pelo manual (resumido)

shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook pb.yml

TASK [debug] ****
ok: [1.2.3.4] => 
  users:
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    dealer:
      shell: /usr/sbin/nologin
ok: [1.2.3.5] => 
  users:
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    tester:
      shell: /bin/bash

Esta configuração serádescontinuadaem 2.13.

Citando oDetalhe obsoleto

“Esse recurso é frágil e não portátil, levando à confusão e ao uso indevido contínuos”

Citando oAlternativas obsoletas

"o filtro combinado explicitamente"

Por exemplo, renomeie o dicionário de usuários comuns parausuários_todos

shell> cat group_vars/all.yml
users_all:
  admin:
    shell: /bin/bash
  ansible:
    shell: /bin/sh

Então o filtrocombinarmescla os dicionários

shell> cat pb.yml
- hosts: all
  tasks:
    - debug:
        var: users_all|combine(users)

dá (resumido)

shell> ansible-playbook pb.yml

TASK [debug] ****
ok: [1.2.3.4] => 
  users_all|combine(users):
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    dealer:
      shell: /usr/sbin/nologin
ok: [1.2.3.5] => 
  users_all|combine(users):
    admin:
      shell: /bin/bash
    ansible:
      shell: /bin/sh
    tester:
      shell: /bin/bash

Nota: Para mesclar listas consulte osolução.

informação relacionada