Wenn Sie Ansible-Aufgaben unter verschiedenen Bedingungen ausführen müssen, dann haben Sie Glück. Ansible when
und andere Bedingungen ermöglichen es Ihnen, Bedingungen zu bewerten, wie zum Beispiel basierend auf dem Betriebssystem oder ob eine Aufgabe von der vorherigen Aufgabe abhängt.
In diesem Tutorial lernen Sie, wie Sie mit Ansible when
und anderen Bedingungen arbeiten können, damit Sie Aufgaben ausführen können, ohne alles durcheinander zu bringen.
Legen wir los!
Voraussetzungen
Dieses Tutorial umfasst praktische Beispiele. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie folgendes haben:
- Einen Ansible-Controller-Host – Dieses Tutorial verwendet Ansible v2.9.24, das auf einem Ubuntu 18.04.5 LTS-System gehostet wird.
- A remote computer to run commands.
- Sie benötigen eine eingerichtete Inventardatei und einen oder mehrere Hosts, die bereits konfiguriert sind, um Ansible-Befehle und Playbooks auszuführen. Das Tutorial wird eine Inventargruppe namens web verwenden.
Arbeiten mit Ansible when
mit mehreren Aufgaben im Playbook
Das Vorhandensein mehrerer Aufgaben in einem Playbook kann lästig sein, wenn sie alle ohne spezifische Bedingungen ausgeführt werden. Lassen Sie uns dieses Tutorial damit beginnen, Ansible when
-Bedingungen im Ansible-Playbook mit mehreren Aufgaben zu definieren.
1. Öffnen Sie ein Terminal auf dem Ansible-Controller-Host.
2. Führen Sie die folgenden Befehle aus, um ein Verzeichnis zu erstellen und es nach Belieben in Ihrem Home-Verzeichnis zu benennen, und wechseln Sie zu diesem Verzeichnis.
Für dieses Beispiel ist das Verzeichnis als ansible_when_condition_demo
benannt. Dieses Verzeichnis enthält das Playbook, das Sie verwenden werden, um die When-Bedingung innerhalb der Ansible-Aufgabe aufzurufen.
3. In Ihrem bevorzugten Code-Editor erstellen Sie eine YAML-Datei im ~/ansible_when_condition_demo-Verzeichnis. In diesem Beispiel wird die Datei als my_playbook.yml bezeichnet. Kopieren Sie den YAML-Playbook-Inhalt unten in die Datei my_playbook.yml.
In beiden Aufgaben (Task-1
und Task-2
) überprüfen die when
-Bedingungen, welches Betriebssystem jeder entfernte Host verwendet. Das Ergebnis wird dann der ansible_os_family
-Platzhaltervariable in jeder Aufgabe übergeben.
Wenn der Wert der Platzhalter ansible_os_family
entweder RedHat
oder Debian
entspricht, führt Ansible eine der Aufgaben aus, um Apache zu installieren.
4. Führen Sie jetzt den Befehl ansible-playbook
unten aus, um die im Playbook definierten Aufgaben (my_playbook.yml) auf dem Remote-Host auszuführen, der in Ihrer vorhandenen Inventardatei definiert ist.
Im untenstehenden Screenshot können Sie sehen, dass:
- Die erste AUFGABE hat einen OK-Status zurückgegeben, was zeigt, dass die Aufgabe keine Änderungen erfordert.
- Die zweite AUFGABE hat den Status überspringen zurückgegeben. Wenn die Bedingung nicht erfüllt ist, wird die Aufgabe übersprungen.
- Die dritte AUFGABE hat einen geändert-Status zurückgegeben, was darauf hinweist, dass der Remote-Host nicht im richtigen Zustand war (d. h. Apache ist nicht vorhanden) und geändert wurde, um Apache zu installieren.

5. Öffnen Sie eine SSH-Sitzung zum Remote-Host, der das Ziel des Ansible-Playbooks war, mit Ihrem bevorzugten SSH-Client, um zu überprüfen, ob Apache installiert und ausgeführt wird.
6. Führen Sie abschließend den folgenden Befehl aus, um zu überprüfen, ob Apache (status apache2
) auf dem Remote-Host installiert ist.
Wie Sie unten sehen können, haben Sie den Apache-Dienst auf der Remote-Maschine installiert.

Arbeiten mit Ansible when
und Schleifen
Sie haben zuvor Ansible-Aufgaben gemäß einer Ansible when
-Bedingung für einen bestimmten Parameter wie ansible_os_family
ausgeführt. Möglicherweise müssen Sie jedoch eine Bedingung mit mehreren in einer Liste definierten Parametern überprüfen. Wenn ja, versuchen Sie, eine loop
-Schleife in einer Aufgabe hinzuzufügen.
Öffnen Sie die Datei my_playbook.yml, die Sie zuvor erstellt haben (Schritt drei unter „Arbeiten mit Ansible when
mit mehreren Aufgaben im Playbook“). Ersetzen Sie den Inhalt der Datei my_playbook.yml durch den unten stehenden Code.
Die Aufgabe im folgenden Code (Aufgabe-1
) führt eine loop
-Schleife aus, bei der die when
-Bedingung überprüft, ob der Wert des Elements größer als fünf ist und das Ergebnis zurückgibt.
Führen Sie nun den folgenden Befehl aus, um das Playbook auszuführen, wie Sie es zuvor getan haben.
Unten sehen Sie den Task-Status überspringen, wenn die Bedingung falsch ist, und den Status geändert, wenn die Bedingung wahr ist.

when
condition for multiple parameters Arbeiten mit Ansible when
und Ansible facts
Vielleicht möchten Sie mehrere Bedingungen hinzufügen, um einen Task auszuführen. Wenn ja, erfahren Sie, wie Sie Ansible-Facts innerhalb der when
-Bedingung nutzen. Ansible-Facts ermöglichen es Ihnen, eine bedingte Anweisung hinzuzufügen, um Tasks basierend auf gesammelten Fakten auszuführen, wie z. B. Ihr Betriebssystem, IP-Adressen, angehängte Dateisysteme und mehr.
Ersetzen Sie den Inhalt der Datei my_playbook.yml durch den unten stehenden Code.
Im folgenden Code werden beide Tasks (Task-1
und Task-2
) nur ausgeführt (Systemabschaltung), wenn eine der folgenden Bedingungen wahr ist:
- Sowohl
distribution
als auchdistribtion_major_version
haben einen wahren Wert zurückgegeben. - Der Wert von
os_family
ist gleichCentOS
.
Führen Sie das Playbook wie zuvor mit dem folgenden Befehl aus.
Beachten Sie unten, dass beide Tasks den Status überspringen anzeigen, da Sie sich in Ubuntu befinden. Der Task wird nur ausgeführt, wenn Sie sich in CentOS befinden.

Arbeiten mit Ansible when
basierend auf registrierten Werten
Manchmal möchten Sie eine Aufgabe ausführen oder überspringen, basierend auf dem Ergebnis einer früheren Aufgabe in einem Playbook. Zum Beispiel möchten Sie möglicherweise einen Dienst nach einer vorherigen Aufgabenaktualisierung konfigurieren. In diesem Fall verwenden Sie eine registrierte Variable. Eine registrierte Variable ermöglicht es Ihnen, das Ergebnis der früheren Aufgabe als Variable zu registrieren und sie für die nächste Aufgabe als Eingabe zu verwenden.
1. Erstellen Sie ein leeres Verzeichnis namens /home/ubuntu/hello.
2. Ersetzen Sie den Inhalt der Datei my_playbook.yml durch den unten stehenden Code, der Folgendes durchführt:
Die erste Aufgabe (Aufgabe-1
) listet die Inhalte (Dateien und Unterverzeichnisse) des Verzeichnisses /etc/hosts
im Speicher auf und speichert dieses Ergebnis über den Befehl register
in der Variablen contents1
.
Die zweite Aufgabe (Aufgabe-2
) listet die Inhalte (derzeit leer) des Verzeichnisses /home/ubuntu/hello im Speicher auf und speichert diese Liste in der Variablen contents2
.
Die dritte Aufgabe (Aufgabe-3
) überprüft und druckt eine „Das Verzeichnis ist leer“-Meldung, wenn entweder das registrierte Ergebnis für die Variable contents1
oder contents2
leer ist.
Die Eigenschaft
stdout
der Variablencontents1
undcontents2
ist die gespeicherte Shell-Ausgabe aus dem Ergebnis des Ausführens der Aufgabenbefehle.
3. Führen Sie schließlich das Playbook mit dem Befehl ansible-playbook
aus.
Wie unten gezeigt, gibt die dritte Aufgabe die Nachricht Verzeichnis ist leer zurück, da das registrierte Ergebnis für die Variable contents2
leer ist.

Ansible when
based on registered values Arbeiten mit Ansible when
in Ansible-Rollen
In diesem letzten Beispiel erfahren Sie, wie Ansible when
innerhalb von Ansible roles
funktioniert. Ansible roles
ermöglichen es Ihnen, Standardkonfigurationen wiederzuverwenden und eine schnellere Bereitstellung durchzuführen. Lesen Sie weiter, um zu erfahren, wie eine Aufgabe Ansible roles
nur aufruft, wenn die Ansible when
-Bedingung wahr ist.
1. Führen Sie die folgenden Befehle aus, um ein Verzeichnis namens ~/ansible_role_when_demo in Ihrem Home-Verzeichnis zu erstellen und zu diesem Ordner als Arbeitsverzeichnis zu wechseln. Das Verzeichnis ~/ansible_role_when_demo wird die Demo-Dateien dieses Beispiels enthalten.
2. Führen Sie anschließend die Befehle aus, um ein Verzeichnis ~/ansible_role_when_demo/roles und ~/ansible_role_when_demo/roles/java/tasks zu erstellen.
Hier ist, was sich in jedem Verzeichnis befinden wird:
- Das Verzeichnis ~/ansible_role_when_demo/roles wird die Rolle enthalten, die Sie bereitstellen müssen.
Standardmäßig sucht Ansible nach Rollen an zwei Orten: in einem Verzeichnis namens roles/ im Verzeichnis, in dem das Playbook liegt, oder in /etc/ansible/roles. Wenn Sie Rollen an verschiedenen Pfaden speichern möchten, geben Sie die Pfade mit dem
- Rolle:
-Parameter im Playbook an.
- Der Ordner ~/ansible_role_when_demo/roles/java/tasks wird eine main.yml Datei enthalten, die Sie für die Bereitstellung einer Rolle benötigen.
Erstellen Sie nun eine Datei mit dem Namen main.yml im Verzeichnis ~/ansible_role_when_demo/roles/java/tasks und kopieren Sie den unten stehenden Playbook-Code in die Datei main.yml.
Das folgende Playbook installiert Java auf dem Remote-Knoten, auf dem es ausgeführt wird, mit dem apt-Modul.
4. Erstellen Sie eine weitere YAML-Datei mit einem Namen Ihrer Wahl und kopieren Sie den unten stehenden Code. In diesem Beispiel ist die Datei benannt ~/ansible_role_when_demo/java-setup.yml.
Der unten stehende Code implementiert die Ansible-Rolle java
beim Remote-Benutzer ubuntu
, der nur dann Administratorenzugriff hat, wenn der Remote-Benutzer auf Debian OS ist.
5. Führen Sie den Befehl tree
aus, um sicherzustellen, dass alle erforderlichen Ordner und Dateien im Verzeichnis ~/ansible_role_when_demo vorhanden sind.

6. Führen Sie schließlich das Playbook mit dem Befehl ansible-playbook
aus. ansible-playbook java-setup.yml
Unten hat die Aufgabe einen Status von changed zurückgegeben, was darauf hinweist, dass Java erfolgreich auf dem entfernten Knoten mit einem Debian-Betriebssystem installiert wurde. Führen Sie das Ansible-Playbook unter Verwendung von
Ansible when
mit Ansible-Rollen aus

Ansible when
with Ansible roles Schlussfolgerung
In diesem Tutorial haben Sie verschiedene Möglichkeiten kennengelernt, Ansible when
und andere Bedingungen zu verwenden. Sie haben auch gelernt, wie Sie Ansible-when
-Bedingungen anwenden, angefangen bei grundlegenden Aufgaben, die Ansible facts
nutzen, bis hin zur Bereitstellung von Ansible-roles
.
Wie würden Sie dieses neu gewonnene Wissen weiterentwickeln? Vielleicht Zeit sparen, indem Sie mehrere Server mit Ansible-Templates konfigurieren und dabei Ansible-when
-Bedingungen anwenden?