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!