Ich habe eine Arbeitsaufgabe zum Migrieren (Kopieren) eines bestimmten Teils meines Home-Verzeichnisses (die vorletzte Zeile ist die wichtige):
- name: "Migrate my-pc module home files"
copy:
src: "{{ migration_source_path }}{{ item }}"
dest: "{{ migration_destination_path }}{{ item }}"
loop: "{{ migration_paths_my_pc }}"
when:
- not is_migrating_all
- "'{{ migration_source_path }}{{ item }}' is exists"
- m_my_pc | bool
Beide ..._path
Variablen enden immer mit einem Schrägstrich ( /
).
Erläuterung:Es nimmt eine Liste von Dateipfaden von migration_paths_my_pc
und kopiert sie von migration_source_path
nach migration_destination_path
). Dies geschieht nur, wenn: das Flag für dieses Modul gesetzt wurde ( m_my_pc
); und der Pfad an der Quelle vorhanden ist; und ich nicht ohnehin alle Dateien aus dem Home-Verzeichnis migriere ( is_migrating_all
).
Meine aktuell funktionierende Lösung (oben) gibt mir die Warnung:
[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: '{{ migration_source_path }}{{ item }}' is exists
Ich verstehe, dass ichentfernenDieGeschweifte Klammern {{
aus when:
Abschnitt, weil Bedingungen habenimpliziertgeschweifte Klammern um sie herum. Das Problem ist, dass ich nicht herausfinden kann, wie ich es zum Laufen bekomme. Einige der vielenerfolglosVersuche sind:
- vars["" + migrate_source_path + item] is exists
- vars[migrate_source_path + item] is exists
- vars[migrate_source_path ~ item] is exists
- vars[migrate_source_path]vars[item] is exists
- '' + migrate_source_path + item is exists
- lookup('/home/k/test/test2/' + item) is exists
- "{{ lookup('vars', 'migrate_source_path' + 'item') is exists }}"
- "{{ lookup('vars', 'migrate_source_path') + lookup('vars', 'item') is exists }}"
- lookup('vars', 'migrate_source_path')lookup('vars', 'item') is exists
Hintergrund:
Ich automatisiere persönliche PC-Setups aus praktischen Gründen und um mehr über Ansible und Ansible-Playbooks zu lernen.
Alle anderen Empfehlungen oder Ratschläge sind ebenfalls willkommen (in den Kommentaren, denke ich).
AKTUALISIEREN:
Meine Designziele (funktionale Bestrebungen) für die Migration sind:
- Ich möchte die Wartungskosten niedrig halten, hätte aber gerne die Information, welche Pfade kopiert und welche übersprungen wurden, falls ich sie brauche. Daher dachte ich, das Skript sollte die Pfade kopieren, die an der Quelle vorhanden sind, ohne anzuhalten oder einen Fehler zu melden, falls einem Pfad eine Quelle fehlt. Warnungen oder andere einfache Meldungen wären toll. Mein aktuelles Skript macht das akzeptabel.
- Es wäre schön, wenn man einfach umschalten könnte, welche Pfade kopiert werden und welche nicht (z. B. könnte sich etwas in Bezug auf eine Migration ändern). Dies zu tun schien
project/vars/
intuitiv und daher vielleicht ein besseres Design, als sie innerhalb der Aufgabe umzuschalten. Andere Variablen, die eher auskommentiert oder geändert werden, sindproject/vars/
ebenfalls auskommentiert. Das Auskommentieren oder Aufheben von Kommentaren ist in den meisten Texteditoren und IDEs ein einziger Hotkey. Also ziemlich praktisch.
Antwort1
Ihre Versuche sind zu kompliziert. Jinja-Trennzeichen sollten nicht in Bedingungen verwendet werden, da Sie sich bereits in etwas befinden, das als Jinja-Ausdruck interpretiert wird. Sie müssen also nur durch etwas ersetzt werden, das das gewünschte Ergebnis liefert.
In diesem Fall erstellen Sie einen String, der aus der Verkettung zweier Variablen besteht. Sie sollten ihn daher durch Verkettung ersetzen:
- (migration_source_path ~ item) is exists
Sie haben in Ihren Beispielen sowohl migrate_source_path
als auch verwendet migration_source_path
, daher habe ich willkürlich migration_source_path
als das Richtige ausgewählt.
Du warst ziemlich nah dran mit:
- '' + migration_source_path + item is exists
Sie haben jedoch eine unnötige führende leere Zeichenfolge, die dem YAML-Parser nicht gefällt. Nachdem Sie dies korrigiert haben, indem Sie es richtig in Anführungszeichen gesetzt oder die unnötige Zeichenfolge entfernt haben:
- "'' + migration_source_path + item is exists"
- migration_source_path + item is exists
Es würde versuchen , migration_source_path
und hinzuzufügen item is exists
, da Sie die richtige Reihenfolge nicht durch Klammern erzwungen haben.
Antwort2
Versuchen Sie, es ein wenig anders zu schreiben. Anstatt mit durch ein Array zu schleifen loop
, geben Sie die Verzeichnisse, die Sie kopieren möchten, in einem with
oder with_fileglob
an. Wenn Sie wirklich eine Liste der Dateien haben möchten, die Sie von einem Ziel zum anderen kopieren möchten, können Sie die Liste in den with
Teil schreiben. Das Modul prüft, ob die Quelldatei vorhanden ist, und zeigt einen Fehler an, was in diesem Fall gut ist, da Ihre Migration sonst fehlerhaft wäre.
Denken Sie daran, dass wir when
Ansible mitteilen, wann eine Aufgabe ausgeführt werden soll oder nicht, und nicht, um die Aufgabe selbst oder ihr Verhalten zu steuern. Um dies zu erreichen, verwenden wir Handler, Register und andere Ressourcen.
Beste grüße.