Mit Roles organisieren

AnsibleBeginner
Jetzt üben

Einführung

Wenn Sie mit Ansible beginnen, ist es zunächst unproblematisch, alles in einer großen Datei playbook.yml abzulegen. Wenn Ihre Automatisierung jedoch auf Hunderte von Zeilen anwächst, wird diese Datei schnell unübersichtlich.

Die Lösung sind Ansible-Roles.

Roles sind wie Ordner in einem Aktenschrank. Statt ein einziges riesiges Dokument zu verwenden, teilen Sie die Inhalte in logische Ordner auf: einen Ordner für Aufgaben des „Webservers“, einen für Aufgaben der „Datenbank“ und so weiter.

Roles sind wichtig, weil Automatisierung mit der Zeit zu Softwareentwicklung wird. Sobald Playbooks mehr als nur wenige Aufgaben enthalten, werden Struktur, Benennung und Wiederverwendung genauso wichtig wie ein erfolgreicher erster Lauf.

In diesem Lab werden Sie:

  1. Mit ansible-galaxy eine standardisierte Role-Struktur erstellen.
  2. Aufgaben in diese Role verschieben.
  3. Die Role aus einem einfachen „Master-Playbook“ ausführen.

Roles sind wichtig, weil skalierbare Automatisierung eine klare Struktur benötigt. Wenn Codebasen wachsen, wird die Organisation genauso wichtig wie ein erfolgreicher erster Lauf.

Eine Role initialisieren

Erstellen Sie zunächst die Verzeichnisstruktur. Sie könnten alle Ordner manuell anlegen, aber Ansible stellt dafür das Tool ansible-galaxy bereit.

Dieses standardisierte Layout ist hilfreich, weil jede Role vorhersehbare Verzeichnisse für Aufgaben, Variablen, Dateien, Templates und Handler enthält. Teams können die Automatisierung anderer Teammitglieder leichter lesen, wenn diese Struktur einheitlich bleibt.

Wechseln Sie in Ihr Projektverzeichnis:

cd ~/project

Erstellen Sie ein Verzeichnis für Ihre Roles:

mkdir roles

Erstellen Sie nun eine neue Role mit dem Namen myrole. Stellen Sie sich das als ein „Paket“ oder „Modul“ für Ihre Automatisierung vor.

ansible-galaxy init roles/myrole

Sehen Sie sich an, was dabei erstellt wurde:

ls -R roles/myrole

Sie sehen mehrere Verzeichnisse (tasks, handlers, vars usw.).

  • tasks: Hier kommen die eigentlichen Schritte hin, zum Beispiel Installieren, Starten und Kopieren.
  • vars: Hier werden Variablen abgelegt.
  • files: Hier werden statische Dateien, zum Beispiel Bilder, abgelegt.

In diesem Lab konzentrieren wir uns auf das Verzeichnis tasks.

Aufgaben für die Role definieren

Jetzt fügen Sie der Role eine Aufgabe hinzu. Die zentrale Aufgabenliste einer Role befindet sich in tasks/main.yml.

Wir erstellen eine einfache Aufgabe, die den Befehl tree installiert. Dabei handelt es sich um ein nützliches Werkzeug zum Anzeigen von Verzeichnisstrukturen.

Öffnen Sie die Aufgabendatei der Role:

nano roles/myrole/tasks/main.yml

Fügen Sie den folgenden Inhalt ein. Beachten Sie, dass wir hier nicht mit tasks: beginnen, weil Sie sich bereits innerhalb der Aufgabendatei befinden.

---
## tasks file for roles/myrole
- name: Ensure tree is installed
  apt:
    name: tree
    state: present
  become: yes

Wichtiger Unterschied: In einem normalen Playbook gibt es einen Abschnitt tasks:. Innerhalb einer Role ist die Datei selbst bereits die Aufgabenliste. Deshalb beginnen Sie direkt damit, die Aufgaben aufzulisten.

Diese Trennung ist ein Grund dafür, dass Roles die Wiederverwendung verbessern. Die Role enthält einen klar abgegrenzten Teil der Automatisierungslogik, während das Playbook entscheidet, wann und wo sie eingebunden wird.

Speichern Sie die Datei und beenden Sie den Editor.

Ein Master-Playbook erstellen

Sie haben nun eine Role, aber eine Role wird nicht selbstständig ausgeführt. Sie benötigen ein „Master-Playbook“, das die Role aufruft.

Erstellen Sie in Ihrem Hauptprojektverzeichnis eine Datei mit dem Namen site.yml:

nano ~/project/site.yml

Dieses Playbook bleibt sehr kurz. Es sagt lediglich: „Führe diese Role auf diesen Hosts aus.“

Das Playbook dient nun eher als Orchestrator und nicht mehr als Container für sämtliche Details. Genau diese architektonische Veränderung sollen Roles ermöglichen.

---
- hosts: localhost
  connection: local
  roles:
    - myrole

Der Code im Detail:

  • roles:: Statt einer Aufgabenliste mit tasks: geben Sie eine Liste von Roles an.
  • - myrole: Ansible sucht im Verzeichnis roles/ nach einem Ordner mit dem Namen myrole und führt den Inhalt von tasks/main.yml aus.

Speichern Sie die Datei und beenden Sie den Editor.

Syntax überprüfen und Playbook ausführen

Überprüfen Sie vor der Ausführung, ob Ihnen Tippfehler unterlaufen sind. Ansible verfügt über einen integrierten Syntax-Checker.

Führen Sie diesen Befehl aus:

ansible-playbook -i inventory --syntax-check site.yml

Wenn alles korrekt ist, gibt Ansible lediglich playbook: site.yml aus.

Falls Fehler auftreten, lesen Sie die Meldung sorgfältig. In der Regel verweist sie auf die genaue Zeilennummer, in der die Einrückung fehlerhaft ist.

Führen Sie das Playbook nun tatsächlich aus:

ansible-playbook -i inventory site.yml

Sie sollten sehen, dass die Aufgabe aus Ihrer Role ausgeführt wird: TASK [myrole : Ensure tree is installed] ... changed

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie Ansible auf professionelle Weise strukturieren.

  1. Eine Role initialisiert: Mit ansible-galaxy haben Sie die standardmäßige Verzeichnisstruktur erstellt.
  2. Aufgaben definiert: Sie haben Ihre Logik in tasks/main.yml abgelegt.
  3. Die Role verwendet: Sie haben die Role aus einem übersichtlichen, einfachen Master-Playbook site.yml aufgerufen.

Wenn Sie mehr Automatisierung schreiben, werden Sie für viele Bereiche eigene Roles erstellen, zum Beispiel apache, mysql und common. Dadurch wird Ihr Code wiederverwendbar und leichter lesbar.