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.