Schleifen und verschachtelte Schleifen mit Ansible

Andrea Dainese
29 September 2023
Post cover

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"