Zusammenführen von Variablen in Ansible mit Rollen

Zusammenführen von Variablen in Ansible mit Rollen

Ich konfiguriere meine Umgebung wie folgt:

Bestandsaufnahme.yml

all:
  children:
    production:
      1.2.3.4
    staging:
      1.2.3.5

In group_vars/all.yml richte ich einen Hash von Benutzern ein, der in ein Playbook eingefügt wird. Ich möchte Benutzer gezielt zu group_vars/staging.yml hinzufügen können, die dann mit derselben Einstellung in meinem group_vars/all.yml zusammengeführt werden.

Gibt es in diesem Fall eine geeignete Möglichkeit, den Hash zusammenzuführen oder eine Vererbung zu deklarieren?

Antwort1

SehenSTANDARD_HASH_VERHALTEN. Zitieren

„Diese Einstellung steuert, wie Variablen in Ansible zusammengeführt werden. Standardmäßig überschreibt Ansible Variablen in bestimmten Rangfolgen, wie unter Variablen beschrieben. Wenn eine Variable mit höherer Rangfolge gewinnt, ersetzt sie den anderen Wert. Einige Benutzer ziehen es vor, dass Variablen, die Hashes sind (in Python auch als „Wörterbücher“ bezeichnet), zusammengeführt werden. Diese Einstellung wird „Merge“ genannt. …“

Angesichts der Lagerbestände undGruppenvariablen

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

Das Spielbuch

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

überschreibt standardmäßig die Wörterbücher. Gibt (gekürzt)

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

WannANSIBLE_HASH_BEHAVIOURist so eingestellt, dass die Wörterbücher des Playbooks zusammengeführt werden (gekürzt)

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

Diese Einstellung wirdveraltetin 2.13.

Zitat ausVeraltetes Detail

„Diese Funktion ist fragil und nicht portierbar, was zu ständiger Verwirrung und Missbrauch führt.“

Zitat ausVeraltete Alternativen

"den Combine-Filter explizit"

Benennen Sie beispielsweise das allgemeine Benutzerwörterbuch um inBenutzer_alle

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

Dann der Filterkombinierenführt die Wörterbücher zusammen

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

gibt (gekürzt)

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

Hinweis: Informationen zum Zusammenführen von Listen finden Sie imLösung.

verwandte Informationen