Arbeiten mit Ansible und anderen Bedingungen

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.

# Erstellen Sie ein Verzeichnis namens ~/ansible_when_condition_demo
mkdir ~/ansible_when_condition_demo
# Ändern Sie das Arbeitsverzeichnis zu ~/ansible_when_condition_demo
cd ~/ansible_when_condition_demo

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.

---
- name: Ansible tasks to work on Ansible When
# Definition des Remote-Servers, auf dem Ansible ausgeführt wird
  hosts: web
  remote_user: ubuntu # Verwendung des Remote-Hosts als ubuntu
  become: true # Die Aufgaben als privilegierter Benutzer (sudo) ausführen
  tasks:

# (Aufgabe-1) Überprüft, ob ansible_os_family == "RedHat" ist, und installiert dann Apache auf dem Remote-Node
    - name: Install Apache on CentOS  Server
      yum: name=httpd  state=present
      become: yes
      when: ansible_os_family == "RedHat"

# (Aufgabe-2) Überprüft, ob ansible_os_family == "Debian" ist, und installiert dann Apache auf dem Remote-Node
    - name: Install Apache on Ubuntu Server
      apt:name=apache2 state=present
      become: yes
      when: ansible_os_family == "Debian"

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.

ansible-playbook my_playbook.yml 

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.
Invoking the ansible-playbook using ansible-playbook command

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.

service status apache2

Wie Sie unten sehen können, haben Sie den Apache-Dienst auf der Remote-Maschine installiert.

Verifying the Apache service on the remote node

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.

---
- name: Ansible tasks to work on Ansible When
# Definieren des Remote-Servers, auf dem Ansible ausgeführt wird
  hosts: web
  remote_user: ubuntu   # Verwenden des Remote-Hosts als "ubuntu"
  become: true
  tasks:
  # (Aufgabe-1) Überprüfen, ob der Wert des Elements größer als 5 ist
    - name: Run with items greater than 5
      ansible.builtin.command: echo {{ item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5*

Führen Sie nun den folgenden Befehl aus, um das Playbook auszuführen, wie Sie es zuvor getan haben.

 ansible-playbook my_playbook.yml

Unten sehen Sie den Task-Status überspringen, wenn die Bedingung falsch ist, und den Status geändert, wenn die Bedingung wahr ist.

Checking the 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 auch distribtion_major_version haben einen wahren Wert zurückgegeben.
  • Der Wert von os_family ist gleich CentOS.
---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Task-1): Zum Herunterfahren des entfernten Knotens, wenn die Distribution CentOS mit einer Hauptversion 6 ist 
    - name: Shut down CentOS 6 systems
      ansible.builtin.command: /sbin/shutdown -t now
      when:
        - ansible_facts['distribution'] == "CentOS"
        - ansible_facts['distribution_major_version'] == "6"
# (Task-2): Zum Herunterfahren des entfernten Knotens, wenn os_family CentOS ist. 
    - name: Shut down CentOS flavored systems
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "CentOS"

Führen Sie das Playbook wie zuvor mit dem folgenden Befehl aus.

ansible-playbook my_playbook.yml

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.

Executing the ansible-playbook with Ansible facts in Ansible when

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 Variablen contents1 und contents2 ist die gespeicherte Shell-Ausgabe aus dem Ergebnis des Ausführens der Aufgabenbefehle.

---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Aufgabe-1): Verzeichnisinhalt im Verzeichnis /etc/hosts auflisten
      - name: List contents of directory and Store in content1
        ansible.builtin.command: ls /etc/hosts
        register: contents1
# (Aufgabe-2): Verzeichnisinhalt im Verzeichnis /home/ubuntu/hello auflisten
      - name: List contents of directory and Store in content2
        ansible.builtin.command: ls /home/ubuntu/hello
        register: contents2
# (Aufgabe-3): Anzeigen, dass das Verzeichnis leer ist, wenn eines der Verzeichnisse 
# /etc/hosts oder /home/ubuntu/hello ein leeres Verzeichnis ist
      - name: Check contents for emptiness for content1 or content2
        ansible.builtin.debug:
          msg: "Directory is empty"
        when: contents1.stdout == "" or contents2.stdout == ""

3. Führen Sie schließlich das Playbook mit dem Befehl ansible-playbook aus.

ansible-playbook my_playbook.yml

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.

Running the Ansible playbook for 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.

# Erstellen Sie ein Verzeichnis namens ~/ansible_role_when_demo in Ihrem Home-Verzeichnis
mkdir ~/ansible_role_when_demo
# Wechseln Sie zum Verzeichnis ~/ansible_role_when_demo
cd ~/ansible_role_when_demo

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 ein Verzeichnis mit dem Namen "Rollen" im Verzeichnis ~/ansible_role_when_demo
mkdir -p roles
# Ändern Sie das Arbeitsverzeichnis in das Verzeichnis ~/ansible_role_when_demo/roles
cd roles 
# Erstellen Sie das übergeordnete (-p) Verzeichnis mit dem Namen "java" und ein Unterverzeichnis mit dem Namen "tasks"
mkdir -p java/tasks

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.

---
# Installation von Java (Open Jdk)
- name: Install Java 1.8
  apt: name=openjdk-8-jdk

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.

- name: Java Installation playbook
# Definition des Remote-Servers, auf dem das Paket bereitgestellt wird
  hosts: myserver
  remote_user: ubuntu   # Verwenden des Remote-Benutzers als ubuntu
  become: true
  tasks:  
  roles:
     - role: java
       # Führen Sie die Aufgabe nur aus, wenn der Remote-Benutzer auf einem Debian OS ist.
       when: ansible_facts['os_family'] == 'Debian'

5. Führen Sie den Befehl tree aus, um sicherzustellen, dass alle erforderlichen Ordner und Dateien im Verzeichnis ~/ansible_role_when_demo vorhanden sind.

Verifying all of the required folders in the ~/ansible_role_when_demo directory

6. Führen Sie schließlich das Playbook mit dem Befehl ansible-playbook aus. ansible-playbook java-setup.yml

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

Running the Ansible playbook using 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?

Source:
https://adamtheautomator.com/ansible-when/