Estoy configurando mi entorno a través de lo siguiente:
inventario.yml
all:
children:
production:
1.2.3.4
staging:
1.2.3.5
En group_vars/all.yml estoy configurando un hash de usuarios que se agregarán en un libro de estrategias. Me gustaría poder agregar usuarios específicamente a group_vars/staging.yml que se fusionarían con la misma configuración en mi group_vars/all.yml.
¿Existe una forma adecuada de fusionar el hash o declarar una herencia en este caso?
Respuesta1
VerDEFAULT_HASH_BEHAVIOUR. Citando
"Esta configuración controla cómo se fusionan las variables en Ansible. De forma predeterminada, Ansible anulará las variables en órdenes de precedencia específicos, como se describe en Variables. Cuando gana una variable de mayor prioridad, reemplazará el otro valor. Algunos usuarios prefieren que las variables sean hashes (también conocidos como 'diccionarios' en términos de Python) se fusionan. Esta configuración se llama 'fusionar'.
Por ejemplo, dado el inventario yvar_grupo
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
el libro de jugadas
shell> cat pb.yml
- hosts: all
tasks:
- debug:
var: users
de forma predeterminada anula los diccionarios. Da (abreviado)
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
CuandoANSIBLE_HASH_BEHAVIOURestá configurado para fusionar los diccionarios que proporciona el libro de jugadas (abreviado)
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 configuración seráobsoletoen 2.13.
Citando elDetalle obsoleto
"Esta característica es frágil y no portátil, lo que genera confusión y uso indebido continuos"
Citando elAlternativas obsoletas
"el filtro combinado explícitamente"
Por ejemplo, cambie el nombre del diccionario de usuarios comunes ausuarios_todos
shell> cat group_vars/all.yml
users_all:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
Entonces el filtrocombinarfusiona los diccionarios
shell> cat pb.yml
- hosts: all
tasks:
- debug:
var: users_all|combine(users)
da (abreviado)
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 fusionar listas, consulte lasolución.