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.