Ansible-Playbook – Variablenverkettung in Bedingungssätzen

Ansible-Playbook – Variablenverkettung in Bedingungssätzen

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 ..._pathVariablen enden immer mit einem Schrägstrich ( /).

Erläuterung:Es nimmt eine Liste von Dateipfaden von migration_paths_my_pcund kopiert sie von migration_source_pathnach 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, sind project/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_pathals auch verwendet migration_source_path, daher habe ich willkürlich migration_source_pathals 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_pathund 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 withoder with_filegloban. 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 withTeil 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 whenAnsible 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.

verwandte Informationen