Bedingte Ausführung von Tasks und Schleifen

Ansible ist ein beliebtes Automatisierungstool, das für die Konfiguration, Bereitstellung und Verwaltung von IT-Infrastrukturen verwendet wird. Zwei wichtige Funktionen, die das Arbeiten mit Playbooks in Ansible noch flexibler und dynamischer machen, sind die bedingte Ausführung von Tasks und Schleifen. Diese ermöglichen es uns, Ansible-Tasks nur dann auszuführen, wenn bestimmte Bedingungen erfüllt sind, und mehrere ähnliche Aufgaben effizienter durchzuführen.

In diesem Blog-Beitrag zeigen wir, wie bedingte Ausführungen und Schleifen in Ansible verwendet werden können, um dynamischere und wiederverwendbare Playbooks zu erstellen.


Bedingte Ausführung von Tasks in Ansible

Die bedingte Ausführung von Tasks in Ansible wird mithilfe des Parameters when realisiert. Dieser ermöglicht es uns, eine Task nur dann auszuführen, wenn eine bestimmte Bedingung erfüllt ist. Der Wert von when kann eine einfache Bedingung oder eine komplexe Logik sein, die auf Variablen, Fakten oder anderen Faktoren basiert.

Beispiel 1: Bedingte Ausführung basierend auf einer Variablen

Schauen wir uns ein einfaches Beispiel an, bei dem wir einen Dienst nur dann starten, wenn er installiert ist:

---
- name: Beispiel-Playbook für bedingte Ausführung
  hosts: webserver
  vars:
    apache_installed: true

  tasks:
    - name: Starte Apache-Dienst
      service:
        name: apache2
        state: started
      when: apache_installed == true

In diesem Beispiel wird der Apache-Dienst nur dann gestartet, wenn die Variable apache_installed den Wert true hat. Wenn die Variable auf false gesetzt ist, wird die Task übersprungen.

Beispiel 2: Bedingte Ausführung basierend auf einem Fakt

Ansible sammelt während der Laufzeit Fakten über das System, auf dem es ausgeführt wird. Diese Fakten können verwendet werden, um Bedingungen zu formulieren. Im folgenden Beispiel starten wir Apache nur, wenn das Betriebssystem Ubuntu ist:

---
- name: Starte Apache nur auf Ubuntu-Systemen
  hosts: webserver

  tasks:
    - name: Starte Apache-Dienst
      service:
        name: apache2
        state: started
      when: ansible_facts['os_family'] == 'Debian'

In diesem Fall nutzen wir die Ansible-Fakten (ansible_facts), um sicherzustellen, dass der Apache-Dienst nur auf Debian-basierten Systemen wie Ubuntu gestartet wird.

Beispiel 3: Mehrere Bedingungen

Es ist auch möglich, mehrere Bedingungen zu kombinieren. Hier ein Beispiel, bei dem eine Task nur dann ausgeführt wird, wenn zwei Bedingungen erfüllt sind:

---
- name: Starte Apache unter bestimmten Bedingungen
  hosts: webserver

  tasks:
    - name: Starte Apache-Dienst
      service:
        name: apache2
        state: started
      when:
        - ansible_facts['os_family'] == 'Debian'
        - apache_installed == true

In diesem Beispiel wird die Task nur ausgeführt, wenn das Betriebssystem Debian-basiert ist und die Variable apache_installed den Wert true hat.


Schleifen in Ansible

Ansible-Schleifen ermöglichen es uns, eine Task mehrmals auszuführen, indem wir über eine Liste oder eine andere Datenstruktur iterieren. Dies ist besonders nützlich, wenn Sie dieselbe Aktion auf mehrere Elemente anwenden müssen, z. B. das Installieren von Paketen oder das Erstellen mehrerer Benutzer.

Beispiel 1: Einfaches Schleifen mit loop

Hier ein Beispiel, wie Sie eine Liste von Paketen mit einer Schleife installieren können:

---
- name: Installiere mehrere Pakete
  hosts: webserver

  tasks:
    - name: Installiere Pakete
      apt:
        name: "{{ item }}"
        state: present
      loop:
        - apache2
        - mysql-server
        - php

In diesem Beispiel wird die apt-Task dreimal ausgeführt – einmal für jedes Paket in der Liste (apache2, mysql-server, php).

Beispiel 2: Verwendung von Dictionaries in Schleifen

Sie können auch komplexere Datenstrukturen wie Dictionaries (Schlüssel-Wert-Paare) in einer Schleife verwenden. Schauen wir uns an, wie wir Benutzer erstellen und ihre Shell konfigurieren können:

---
- name: Erstelle Benutzer mit bestimmten Shells
  hosts: all

  tasks:
    - name: Benutzer anlegen
      user:
        name: "{{ item.name }}"
        shell: "{{ item.shell }}"
      loop:
        - { name: 'max', shell: '/bin/bash' }
        - { name: 'anna', shell: '/bin/zsh' }

Hier erstellen wir zwei Benutzer (max und anna) und weisen ihnen jeweils eine spezifische Shell zu (/bin/bash für Max und /bin/zsh für Anna).

Beispiel 3: Schleifen mit with_items

Vor Ansible 2.5 wurde die Direktive with_items verwendet, um Schleifen zu definieren. Dies wird zwar nicht mehr empfohlen, aber es ist immer noch in älteren Playbooks zu finden:

---
- name: Installiere Pakete mit with_items
  hosts: webserver

  tasks:
    - name: Installiere Pakete
      apt:
        name: "{{ item }}"
        state: present
      with_items:
        - apache2
        - mysql-server
        - php

Die moderne Methode ist jedoch die Verwendung von loop, wie im ersten Beispiel gezeigt.


Kombination von Schleifen und bedingter Ausführung

Es ist auch möglich, Schleifen und bedingte Ausführungen zu kombinieren. Angenommen, wir möchten eine Liste von Paketen installieren, aber nur auf Debian-basierten Systemen:

---
- name: Installiere Pakete nur auf Debian-Systemen
  hosts: webserver

  tasks:
    - name: Installiere Pakete
      apt:
        name: "{{ item }}"
        state: present
      loop:
        - apache2
        - mysql-server
        - php
      when: ansible_facts['os_family'] == 'Debian'

In diesem Beispiel wird die Schleife nur dann ausgeführt, wenn das Betriebssystem Debian-basiert ist. Auf Nicht-Debian-Systemen wird die gesamte Task übersprungen.


Fazit

Mit der bedingten Ausführung von Tasks und Schleifen bietet Ansible eine hohe Flexibilität, um Playbooks dynamischer und anpassbarer zu gestalten. Bedingte Ausführungen ermöglichen es, Tasks nur unter bestimmten Bedingungen auszuführen, was die Effizienz der Automatisierung erhöht. Schleifen erleichtern die Wiederholung von Aufgaben, was besonders bei der Verwaltung mehrerer ähnlicher Ressourcen nützlich ist.

Durch die Kombination beider Funktionen können Sie komplexe Automatisierungsszenarien leicht umsetzen und Ihre Playbooks effizienter und wiederverwendbarer gestalten.


Ich hoffe, dieses Tutorial hat Ihnen geholfen, die Grundlagen der bedingten Ausführung und Schleifen in Ansible besser zu verstehen. Viel Erfolg bei der Automatisierung Ihrer IT-Prozesse!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert