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:
- Mit
ansible-galaxyeine standardisierte Role-Struktur erstellen. - Aufgaben in diese Role verschieben.
- 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 mittasks:geben Sie eine Liste von Roles an.- myrole: Ansible sucht im Verzeichnisroles/nach einem Ordner mit dem Namenmyroleund führt den Inhalt vontasks/main.ymlaus.
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.
- Eine Role initialisiert: Mit
ansible-galaxyhaben Sie die standardmäßige Verzeichnisstruktur erstellt. - Aufgaben definiert: Sie haben Ihre Logik in
tasks/main.ymlabgelegt. - Die Role verwendet: Sie haben die Role aus einem übersichtlichen, einfachen Master-Playbook
site.ymlaufgerufen.
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.


