Palo Alto Firewall as Code
22 June 2024
Schleifen und verschachtelte Schleifen mit Ansible
Meiner Meinung nach gehört die Schleifenverwaltung zu den weniger verständlichen Konstrukten in Ansible. Wenn wir dann über verschachtelte Schleifen sprechen, wird die Situation noch komplexer. In diesem kurzen Beitrag werden wir die Rezepte für folgende Punkte betrachten:
- Schleifen über eine Liste;
- Schleifen über ein Wörterbuch;
- verschachtelte Schleifen.
Schleifen über eine Liste
Die einfachste Schleife beinhaltet die Verwendung einer Liste und das Ausführen einer Reihe von Aktionen für jedes Element, standardmäßig item
:
- ansible.builtin.debug:
msg: "Now reading {{ item }}"
with_items: "{{ list1 }}"
Wie wir sehen können, ist das Element innerhalb der Schleife über die Variable item
zugänglich.
Schleifen über ein Wörterbuch
Wenn wir über ein Wörterbuch iterieren (das wäre nicht der richtige Begriff), werden wir wahrscheinlich sowohl auf den Schlüssel als auch auf den Wert zugreifen müssen. Die Syntax ähnelt dem vorherigen Fall:
- ansible.builtin.debug:
msg: "Now reading {{ item.key }} by {{ item.value }}"
with_dict: "{{ dict1 }}"
In diesem Fall sehen wir, dass der Schlüssel über item.key
zugänglich ist, während der zugehörige Wert über item.value
zugänglich ist.
Verschachtelte Schleifen
Wenn wir verschachtelte Schleifen verwenden müssen, wird die Syntax komplexer, und wir müssen uns auf externe Dateien verlassen. Schauen wir uns die Syntax an:
- ansible.builtin.include_tasks: sub_task1.yml
with_items: "{{ list1 }}"
loop_control:
loop_var: outer_item
Für jedes Element in der Liste list1
wird das Playbook die in der Datei sub_task1.yml
enthaltenen Aufgaben ausführen. Bei der Ausführung der Teilaufgaben ist das aktuelle Element über die Variable outer_item
zugänglich:
- ansible.builtin.debug:
msg: "Now reading {{ outer_item }} from outer loop"
In derselben Datei können wir eine weitere Schleife ausführen, indem wir eine dritte Datei aufrufen:
- ansible.builtin.include_tasks: sub_task2.yml
with_items: "{{ list2 }}"
loop_control:
loop_var: inner_item
Die Datei sub_task2.yml
definiert die Aufgaben, die die Variablen aus der ersten (äußeren) und zweiten (inneren) Schleife verwenden werden:
- ansible.builtin.debug:
msg: "Now reading {{ outer_item}} / {{ inner_item }} from inner loop"