Ihr erstes Playbook schreiben

AnsibleBeginner
Jetzt üben

Einführung

Im vorherigen Lab haben Sie einen einzelnen Befehl (ansible ... -m ping) ausgeführt. Das ist für schnelle Prüfungen nützlich. Die eigentliche Stärke von Ansible liegt jedoch in Playbooks.

Ein Playbook ist eine Textdatei mit Anweisungen zur Automatisierung. Im Gegensatz zu einem normalen Shell-Skript beschreibt ein Playbook normalerweise den gewünschten Endzustand und nicht jeden einzelnen technischen Befehlsschritt.

Dieses Modell des gewünschten Zustands gehört zu den wichtigsten Konzepten von Ansible. Statt exakt vorzugeben, welche Befehle ausgeführt werden sollen, beschreiben Sie normalerweise die Bedingung, die nach Abschluss der Automatisierung erfüllt sein soll.

Playbooks werden in YAML geschrieben, einem für Menschen gut lesbaren Datenformat. Dadurch lassen sich Automatisierungen leichter überprüfen, gemeinsam nutzen und warten.

In diesem Lab schreiben Sie ein Playbook, das einen Server in einen Webserver verwandelt:

  1. Sie installieren Nginx, einen weit verbreiteten Webserver.
  2. Sie stellen sicher, dass der Nginx-Dienst läuft.

Anschließend führen Sie dieses Playbook aus, um Ihren lokalen Rechner zu konfigurieren.

Die Playbook-Datei erstellen

Zuerst erstellen Sie die Playbook-Datei. Das Haupt-Playbook heißt üblicherweise site.yml.

Stellen Sie zunächst sicher, dass Sie sich im Projektverzeichnis befinden:

cd ~/project

Erstellen und öffnen Sie nun mit dem Texteditor nano eine neue Datei namens site.yml:

nano site.yml

Geben Sie ganz oben in der Datei drei Bindestriche ein. Damit markieren Sie den Beginn eines YAML-Dokuments.

---

Wichtige YAML-Regeln:

  • Einrückungen sind entscheidend! Verwenden Sie Leerzeichen, normalerweise 2, und keine Tabulatoren. Bei falschen Einrückungen meldet Ansible einen Fehler.
  • Speichern Sie die Datei regelmäßig. Drücken Sie in nano Ctrl+O und anschließend Enter, um zu speichern. Lassen Sie die Datei für die nächsten Schritte geöffnet.

Das Play definieren

Ein Playbook besteht aus einem oder mehreren „Plays“. Ein Play ordnet eine Gruppe von Hosts den Aufgaben zu, die auf diesen Hosts ausgeführt werden sollen.

Durch diese Zuordnung von Hostgruppe und Aufgaben kann ein Playbook von einem einzelnen Rechner auf viele Rechner skaliert werden. Die Logik bleibt an einer Stelle, während das Inventory festlegt, wo sie angewendet wird.

Fügen Sie in Ihrer Datei site.yml unterhalb von --- die folgenden Zeilen ein:

---
- hosts: webservers
  become: yes

Den Code verstehen:

  • - hosts: webservers: Damit weisen Sie Ansible an: „Führe diese Anweisungen auf jedem Server aus, der in meinem Inventory in der Gruppe [webservers] aufgeführt ist.“
  • become: yes: Das entspricht der Verwendung von sudo vor einem Befehl. Ansible erhält dadurch Root-Rechte, die für die Installation von Software benötigt werden.

Achten Sie darauf, dass - hosts ganz am Anfang der Zeile beginnt. Vor dem Bindestrich dürfen keine Leerzeichen stehen.

Speichern Sie die Datei (Ctrl+O, Enter).

Eine Installationsaufgabe hinzufügen

Jetzt legen Sie fest, was Ansible tun soll. Dazu fügen Sie eine Liste von Aufgaben hinzu. Jede Aufgabe verwendet ein Modul.

Da wir Ubuntu verwenden, nutzen wir das Modul apt, um Nginx zu installieren.

Ändern Sie site.yml so, dass die Datei wie folgt aussieht:

---
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

Den Code verstehen:

  • tasks:: Beginnt die Liste der Aufgaben.
  • - name: ...: Eine Beschreibung für Menschen. Diese Beschreibung wird beim Ausführen des Playbooks auf dem Bildschirm angezeigt.
  • apt:: Ruft das Modul apt auf.
  • name: nginx: Gibt das gewünschte Paket an.
  • state: present: Das ist der entscheidende deklarative Teil. Sie sagen nicht „Installiere es jetzt“, sondern „Stelle sicher, dass es vorhanden ist“.
    • Fehlt das Paket, installiert Ansible es.
    • Ist es bereits vorhanden, unternimmt Ansible nichts. Diese Eigenschaft heißt Idempotenz.

Idempotenz ist ein zentraler Bestandteil der Konfigurationsverwaltung. Sie bedeutet, dass Sie dieselbe Automatisierung sicher wiederholt ausführen können und dabei konsistente Ergebnisse erhalten, statt doppelte Seiteneffekte zu erzeugen.

Überprüfen Sie die Einrückungen:

  • tasks muss auf derselben Ebene wie become stehen.
  • - name muss eingerückt sein (2 Leerzeichen).
  • apt muss auf derselben Ebene wie name stehen.
  • name und state müssen unterhalb von apt weiter eingerückt sein.

Speichern Sie die Datei.

Eine Dienstaufgabe hinzufügen

Nur die Software zu installieren reicht nicht aus. Sie müssen außerdem sicherstellen, dass das Programm läuft. Dafür verwenden wir das Modul service.

Dieses Beispiel zeigt außerdem, wie Playbooks den Systemzustand in mehreren Ebenen beschreiben. Eine Aufgabe stellt sicher, dass das Paket vorhanden ist, eine weitere, dass der Dienst aktiv ist. Zusammen beschreiben sie den Zielzustand, den der Host erreichen soll.

Fügen Sie Ihrer Aufgabenliste in site.yml eine zweite Aufgabe hinzu:

---
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Start nginx
      service:
        name: nginx
        state: started

Den Code verstehen:

  • service:: Dieses Modul verwaltet Systemdienste, ähnlich wie systemctl.
  • state: started: Stellt sicher, dass der Dienst läuft. Wenn er gestoppt ist, startet Ansible ihn.

Wichtig: Der Bindestrich - der zweiten Aufgabe muss genau auf derselben Einrückungsebene stehen wie der Bindestrich der ersten Aufgabe.

Speichern Sie die Datei und beenden Sie nano (Ctrl+X, dann Y, dann Enter).

Das Playbook ausführen

Jetzt kommt der praktische Teil: Sie führen Ihre Automatisierung aus!

Dazu verwenden Sie den Befehl ansible-playbook. Geben Sie an, welches Playbook (site.yml) ausgeführt und welches Inventory (hosts.ini) verwendet werden soll.

Führen Sie diesen Befehl aus:

ansible-playbook site.yml -i hosts.ini

Beobachten Sie die Ausgabe. Sie sehen Folgendes:

  1. Gathering Facts: Ansible prüft zunächst die Systeminformationen.
  2. Install nginx: Der Status wird als changed (gelb) angezeigt, wenn das Paket installiert werden musste.
  3. Start nginx: Der Status wird als changed (gelb) angezeigt, wenn der Dienst gestartet werden musste.

Wenn Sie exakt denselben Befehl ein zweites Mal ausführen, ist die Ausgabe grün und enthält ok. Das bedeutet: „Alles befindet sich bereits im gewünschten Zustand, daher wurde nichts geändert.“

Prüfen Sie abschließend manuell, ob Nginx läuft:

systemctl status nginx

Sie sollten Active: active (running) sehen.

Zusammenfassung

In diesem Lab haben Sie Ihr erstes Ansible-Playbook geschrieben. Sie haben Folgendes gelernt:

  1. YAML-Syntax: Wie Sie ein Playbook mit korrekten Einrückungen strukturieren.
  2. Plays: Wie Sie mit hosts festlegen, wo Aufgaben ausgeführt werden, und mit become die Verwendung von sudo aktivieren.
  3. Aufgaben: Wie Sie Module wie apt zur Installation und service zum Starten eines Dienstes verwenden.
  4. Idempotenz: Warum das mehrfache Ausführen eines Playbooks sicher ist und stabile Ergebnisse liefert.

Sie sind damit von der manuellen Ausführung einzelner Befehle zur Definition von „Infrastructure as Code“ übergegangen.