Abhängig vom Wert (True / False) einer in group_vars definierten Variablen versuche ich, einige Variablen in einer vars-Datei zu definieren. Ihr Wert hängt vom Wert der Gruppenvariablen ab.
Meine aktuelle var-Datei sieht folgendermaßen aus:
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
Für jede meiner Rollen verwende ich eine Variable, die in dieser Datei definiert ist.
Mein Test-Playbook sieht wie folgt aus:
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
Der Fehler, den ich nach dem Ausführen des Playbooks erhalte, ist:
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
Mache ich hier etwas dummes oder wird das nicht mal unterstützt? Ich habe versucht, einen anderen Weg zu finden, um diese Vars zu definieren (ich habe viele davon), aber ich habe es nicht geschafft, hier etwas Funktionales zu finden. Irgendwelche Vorschläge?
ansible
automation
jinja
pandoJohn
quelle
quelle
template
Modulaufrufs verwenden.test
es gruppenabhängig ist, sollte es in group_vars platziert werden.Antworten:
Ich glaube nicht, dass Sie das können. Normalerweise erstelle ich separate Dateien, um bedingte Variablensammlungen zu speichern und benutze eine
when
Klausel, um sie unter einer bestimmten Bedingung einzuschließen:quelle
Mit Ansible kann eine der folgenden Formen eine Variable bedingt definieren:
Durch Kombination der obigen Syntax mit vars lookup können wir komplexe Variablen laden (in diesem Fall auflisten):
Es gibt eine andere Möglichkeit, das bedingte Laden von Bäumen mit vars lookup durchzuführen. Dieser Weg ist praktisch, wenn Sie eine Falllogik implementieren müssen (dh die Bedingungsvariable hat mehr als zwei mögliche Werte):
quelle
Trotzdem wäre es schön, ich fürchte, dass dein Weg nicht möglich ist (oder ich weiß nicht, wie es richtig ist).
Ich würde vorschlagen, zuerst die vars-Datei aus der jinja-Vorlage vorzubereiten und sie dann in include_vars einzuschließen. Siehe das Beispiel-Playbook:
Der Inhalt der Beispiel-Jinja-Vorlage /tmp/vars.yaml.j2 ist:
quelle
- debug: var=test
ich sehen kann, dass es definiert beidetest.var1
undtest.var2
mit den erwarteten Werten. Sie sollten also in der Lage sein, diese Variablen in anderen Aufgaben des Playbooks zu verwenden.AFAIK, das, was Sie versuchen, ist für Jinja2-Vorlagen und nicht für yml-Dateien. Aus der Dokumentation :
Sie können eine separate .yml-Datei mit einer Wiedergabe vorbereiten, die die benötigten Variablen mit Hilfe der when-Klauseln einrichtet und diese dann in Ihr Haupt-Wiedergabebuch importiert (oder einschließt). Auf diese Weise können Sie alle Variablen in einer einzigen Datei bedingt definieren.
ODER: Verwenden Sie Rollen. Ich denke, Rollen sind der adäquateste Ansatz, um Ihr Problem zu lösen.
quelle
Am Ende habe ich 2 separate var-Dateien erstellt - nennen wir sie
type_a.yml
undtype_b.yml
- und ich habe eine Gruppenvariable definiert, die angibt, welche Datei verwendet werden soll - so etwas wietype_of_file: a
. So sieht mein Playbook jetzt aus:Danke für alle Antworten. Ich finde sie wirklich hilfreich.
quelle
Ich hoffe, dass der folgende Ausschnitt (aus der Ansible-Dokumentation ) eine sinnvolle Ergänzung zu den nützlichen Beiträgen anderer oben ist.
quelle