Das ist der Teil:
vars_files:
- vars/vars.default.yml
- vars/vars.yml
Wenn keine Datei vars/vars.yml
vorhanden ist, liegt ein Fehler vor.
ERROR: file could not read: /.../vars/vars.yml
Wie kann ich zusätzliche Variablen nur dann aus dieser Datei laden, wenn sie vorhanden sind? (ohne fehler)
Laut Ansible-Entwicklern besteht der richtige Weg, dies zu lösen, darin, Folgendes zu verwenden:
Außerdem sagen sie :
quelle
include_vars
in der Aufgabe wird eine hohe Priorität von Variablen im Vergleich zu Rolledefaults
oder gebenvars
Dieses Problem trat in einem Setup auf, in dem ich mehrere Bereitstellungsumgebungen (Live, Demo, Sandbox) auf demselben physischen Server erstellen musste (hier sind keine virtuellen Maschinen zulässig), und dann ein Skript zum Bereitstellen beliebiger SVN-Repos
Dies erforderte einen Verzeichnisbaum von (optionalen) variablen.yml-Dateien, die übereinander zusammengeführt wurden und keine Ausnahme auslösten, falls eine fehlte
Beginnen Sie, indem Sie das Zusammenführen von Variablen in Ansible aktivieren. Beachten Sie, dass dies nur eine flache Hash-Zusammenführung (1 Ebene tief) und keine vollständig rekursive, tiefe Zusammenführung bewirkt
ansible.cfg
Ansible Verzeichnislayout
rolls / deploy / tasks / includes.yml
Dies ist die Hauptlogik für einen Verzeichnisbaum optionaler Variablendateien.
group_vars / all.yml
Konfigurieren Sie Standardvariablen für das Projekt und verschiedene Benutzer und Umgebungen
role / deploy / vars / main.yml
Projektstandards
role / deploy / vars / project_1.yml
Standardeinstellungen für project_1
role / deploy / vars / live / main.yml
Standardeinstellungen für die Live-Umgebung überschreiben die Standardeinstellungen des Projekts
role / deploy / vars / live / project_1.yml
endgültige Überschreibungen für project_1 in der Live-Umgebung
Spielbücher / demo.yml
Konfigurieren Sie separate Playbooks für jede Umgebung
WARNUNG: Da sich alle Umgebungen auf einem einzigen Host befinden, müssen alle Playbooks einzeln ausgeführt werden. Andernfalls versucht Ansible, alle Skripte als erster SSH-Anmeldebenutzer auszuführen und verwendet nur die Variablen für den ersten Benutzer. Wenn Sie alle Skripten nacheinander ausführen müssen, verwenden Sie xargs, um sie jeweils als separate Befehle auszuführen.
quelle
Hinweis: Die Pfadtests (is file, is exists, ...) funktionieren nur mit absoluten Pfaden oder Pfaden relativ zum aktuellen Arbeitsverzeichnis, wenn der Befehl ansible-playbook ausgeführt wird. Dies ist der Grund, warum wir die Suche verwendet haben. Die Suche akzeptiert Pfade relativ zum Playbook-Verzeichnis und gibt den absoluten Pfad zurück, wenn die Datei vorhanden ist.
quelle
Oder auf eine yaml Art:
Das heißt, anstatt ein Array in eine Zeile mit eckigen Klammern zu schreiben, wie:
Verwenden Sie die Methode yaml, um Array-Werte in mehrere Zeilen zu schreiben, z.
Wie bereits erwähnt, wird nach einer vars-Datei mit dem Namen gesucht
{{ ansible_hostname }}.yml
, und falls sie nicht vorhanden ist, wird sie verwendetdefault.yml
quelle
{{ ansible_hostname }}.yml
Dateiname statt../path/to/file1
. Was ist der Sinn? Man kann eine unbegrenzte Anzahl von Eingabedateinamen hinzufügen.Verschiedene Teile zusammensetzen ... include_vars mit einer when-Klausel, die wahr ist, wenn die Datei existiert. dh
quelle
Neue Antwort basierend auf den neuesten Ansible-Versionen - im Grunde sollten Sie diese verwenden
with_first_found
,skip: true
um die Aufgabe zu überspringen, wenn keine Datei gefunden wird.Dies macht es so, dass Sie keine Fallback-VARS-Datei in dieser Liste haben müssen.
Siehe verwandte: /programming//a/39544405/100134
quelle