Fusionar variables en Ansible con roles

Fusionar variables en Ansible con roles

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.

información relacionada