Ansible bietet ein flexibles und skalierbares Rollenkonzept, das es uns ermöglicht, komplexe Automatisierungsaufgaben in wiederverwendbare, modulare Einheiten zu unterteilen. Die Erstellung eigener Rollen ist eine der effizientesten Möglichkeiten, um Konfigurationsmanagement mit Ansible zu organisieren und wiederverwendbar zu machen. In diesem Blog-Beitrag zeige ich, wie du eigene Ansible-Rollen mit Hilfe von ansible-galaxy
erstellst.
Was ist Ansible Galaxy?
Ansible Galaxy
ist eine Plattform, die von der Ansible-Community bereitgestellt wird, um vorgefertigte Rollen zu teilen. Neben der Plattform wird das Kommandozeilen-Tool ansible-galaxy
verwendet, um Rollen lokal zu verwalten und zu erstellen.
Mit dem ansible-galaxy
-Befehl kannst du:
- Eigene Rollen lokal erstellen.
- Rollen aus der Ansible Galaxy-Community herunterladen.
- Rollen verwalten und aktualisieren.
In diesem Beitrag konzentrieren wir uns auf die Erstellung eigener Rollen.
Warum sollte man eigene Rollen erstellen?
Das Erstellen eigener Rollen bietet mehrere Vorteile:
- Modularität: Rollen ermöglichen es, Aufgaben in kleinere, logische Teile zu zerlegen.
- Wiederverwendbarkeit: Eine gut geschriebene Rolle kann in mehreren Projekten verwendet werden.
- Wartbarkeit: Rollen helfen dabei, Konfigurationen übersichtlich und strukturiert zu halten, was die Wartung erleichtert.
- Teamarbeit: Rollen erlauben es verschiedenen Teams, unabhängig an bestimmten Aspekten einer Infrastruktur zu arbeiten.
Schritte zum Anlegen einer eigenen Rolle
1. Voraussetzungen
Bevor wir mit der Erstellung einer Rolle beginnen, stelle sicher, dass Ansible auf deinem System installiert ist. Du kannst dies mit folgendem Befehl überprüfen:
ansible --version
Falls Ansible nicht installiert ist, kannst du es auf einem Linux-System mit dem folgenden Befehl installieren:
sudo apt install ansible
2. Anlegen einer Rolle mit ansible-galaxy init
Um eine eigene Rolle anzulegen, verwenden wir den Befehl ansible-galaxy init
. Dies erstellt eine Verzeichnisstruktur, die alle erforderlichen Komponenten für die Rolle enthält.
ansible-galaxy init <rollenname>
Beispiel:
ansible-galaxy init apache_webserver
Dieser Befehl erzeugt die folgende Verzeichnisstruktur:
apache_webserver/
├── defaults/
│ └── main.yml
├── files/
├── handlers/
│ └── main.yml
├── meta/
│ └── main.yml
├── tasks/
│ └── main.yml
├── templates/
├── tests/
│ ├── inventory
│ └── test.yml
└── vars/
└── main.yml
3. Verzeichnisstruktur einer Rolle
Die Verzeichnisstruktur mag auf den ersten Blick umfangreich erscheinen, aber jede Komponente hat ihren eigenen Zweck:
tasks/
: Enthält die Hauptaufgaben der Rolle. In der Dateimain.yml
werden die Aktionen definiert, die Ansible ausführen soll.handlers/
: Definiert Handler, die bei Änderungen ausgeführt werden, wie z.B. das Neustarten eines Dienstes.files/
: Hier werden Dateien abgelegt, die auf das Zielsystem kopiert werden sollen.templates/
: Hier werden Jinja2-Templates gespeichert, die mit Variablen gefüllt und auf das Zielsystem übertragen werden.vars/
: Enthält benutzerdefinierte Variablen für die Rolle.defaults/
: Enthält Standardwerte für Variablen. Diese können von anderen Variablen überschrieben werden.meta/
: Hier werden Metadaten der Rolle gespeichert, z.B. Abhängigkeiten von anderen Rollen.tests/
: Ermöglicht die Definition von Tests für die Rolle.
Beispiel: Eigene Apache-Webserver-Rolle
Um die Rolle besser zu verstehen, werden wir nun eine einfache Rolle erstellen, die den Apache-Webserver auf einem Server installiert und konfiguriert.
1. Aufgaben definieren (tasks/main.yml
)
Beginnen wir mit der Definition der Aufgaben, die die Rolle ausführt. In diesem Fall wollen wir Apache installieren, starten und sicherstellen, dass es bei einem Neustart des Servers automatisch gestartet wird.
---
- name: Installiere Apache
apt:
name: apache2
state: present
become: true
- name: Starte Apache und sorge dafür, dass es beim Booten aktiviert ist
systemd:
name: apache2
enabled: true
state: started
become: true
2. Variablen hinzufügen (defaults/main.yml
)
Es ist sinnvoll, bestimmte Werte wie den Server-Administrator oder den Dokumentenpfad als Variablen zu definieren, damit sie bei Bedarf angepasst werden können.
---
server_admin: "webmaster@localhost"
doc_root: "/var/www/html"
3. Apache-Konfigurationsvorlage erstellen (templates/apache2.conf.j2
)
Jetzt erstellen wir eine Vorlage für die Apache-Konfiguration, die mit den oben definierten Variablen gefüllt wird.
<VirtualHost *:80>
ServerAdmin {{ server_admin }}
DocumentRoot {{ doc_root }}
</VirtualHost>
4. Vorlagendatei anwenden (tasks/main.yml
)
Nun fügen wir eine Aufgabe hinzu, die diese Konfigurationsvorlage auf dem Zielsystem bereitstellt.
- name: Übertrage Apache-Konfiguration
template:
src: apache2.conf.j2
dest: /etc/apache2/sites-available/000-default.conf
notify: Starte Apache neu
5. Handler definieren (handlers/main.yml
)
Ein Handler wird ausgelöst, wenn sich die Konfiguration ändert. Hier definieren wir einen Handler, der Apache neu startet.
---
- name: Starte Apache neu
systemd:
name: apache2
state: restarted
6. Rolle testen
Du kannst die Rolle in einem Playbook verwenden, um die Installation auf einem Host durchzuführen. Erstelle dazu ein Playbook site.yml
:
---
- hosts: webserver
become: true
roles:
- apache_webserver
Führe das Playbook dann mit Ansible aus:
ansible-playbook -i inventory site.yml
Fazit
Das Anlegen eigener Rollen mit ansible-galaxy
ist eine hervorragende Möglichkeit, die Ansible-Projekte modular und wiederverwendbar zu gestalten. Durch die klare Struktur und die Möglichkeit, Rollen einfach zu verteilen und zu testen, wird die Verwaltung von Konfigurationen deutlich vereinfacht.
In diesem Beitrag haben wir Schritt für Schritt gezeigt, wie du eine eigene Rolle erstellen und diese in einem Playbook verwenden kannst. Du kannst dieses Konzept erweitern und komplexere Rollen für spezifische Anforderungen entwickeln. Indem du deine Rollen gut strukturierst und modular aufbaust, wird deine Ansible-Umgebung effizienter und leichter wartbar.
Ich hoffe, dieser Beitrag hat dir einen klaren Einstieg in die Erstellung eigener Rollen mit ansible-galaxy
gegeben! Wenn du Fragen oder Anregungen hast, hinterlasse gerne einen Kommentar!