Ansible Roles

6 Kernkonzepte
Die wichtigsten Konzepte für Ansible Roles: Verzeichnisstruktur · tasks · handlers · vars · templates · meta Roles sind das Herzstück der Wiederverwendbarkeit in Ansible. Sie ermöglichen die strukturierte Organisation von Playbooks, Tasks, Variablen, Templates und Handlern – ideal für komplexe Automatisierungen.

Verzeichnisstruktur – Die Rolle anlegen

ansible-galaxy init <role>
ansible-galaxy init webserver # Erzeugt folgende Struktur: webserver/ ├── defaults/ ├── files/ ├── handlers/ ├── meta/ ├── tasks/ ├── templates/ └── vars/

Verzeichnisstruktur – jede Rolle hat eine standardisierte Verzeichnisstruktur. Mit ansible-galaxy init wird eine neue Rolle mit allen Unterverzeichnissen angelegt.

Rollen-Verzeichnisse im Detail

Verzeichnis Beschreibung
defaults/ Standardvariablen (niedrigste Priorität)
vars/ Variablen (höhere Priorität als defaults)
tasks/ Hauptaufgaben der Rolle (main.yml)
handlers/ Handler für Service-Neustarts etc.
templates/ Jinja2-Templates (Endung .j2)
files/ Statische Dateien für copy-Modul
meta/ Metadaten (Abhängigkeiten, Autor, Plattformen)
tests/ Test-Playbooks für die Rolle
Beispiele
# Rolle erstellen
ansible-galaxy init nginx
# Rolle im Playbook verwenden
---
- name: Webserver einrichten
hosts: webservers
roles:
- nginx
- role: postgresql
vars:
postgresql_version: 15
Tipp: Nicht alle Verzeichnisse sind Pflicht. Wenn Sie keine Handlers oder Templates benötigen, können Sie die Ordner weglassen. Die Datei main.yml ist der Einstiegspunkt für tasks, handlers, vars und defaults.

tasks – Die Hauptaufgaben

tasks/main.yml · include_tasks · import_tasks
# tasks/main.yml --- - name: Nginx installieren apt: name: nginx state: present notify: nginx restart

tasks sind die zentralen Aufgaben einer Rolle. Sie werden in tasks/main.yml definiert und beschreiben, welche Aktionen auf den Zielsystemen ausgeführt werden.

Beispiele
# tasks/main.yml – Nginx-Rolle
---
- name: Nginx installieren
apt:
name: nginx
state: present
notify: nginx restart
- name: Nginx-Konfiguration kopieren
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: nginx restart
- name: Nginx starten
service:
name: nginx
state: started
enabled: yes
Tipp: Nutzen Sie include_tasks oder import_tasks, um große main.yml in mehrere Dateien aufzuteilen – z.B. install.yml, configure.yml, service.yml.

handlers – Service-Neustarts auslösen

handlers/main.yml · notify · listen
# handlers/main.yml --- - name: nginx restart service: name: nginx state: restarted

handlers werden nur ausgeführt, wenn sie durch eine Task mit notify ausgelöst werden – und nur am Ende des Playbooks. Sie eignen sich perfekt für Service-Neustarts nach Konfigurationsänderungen.

Beispiele
# handlers/main.yml
---
- name: nginx restart
service:
name: nginx
state: restarted
- name: apache reload
service:
name: apache2
state: reloaded
# Handler mit listen (mehrere Namen)
- name: Restart webserver
service:
name: nginx
state: restarted
listen: webserver restart
# In der Task: notify an den Handler
notify: nginx restart
Tipp: Verwenden Sie listen, um mehrere Handler-Namen auf eine Aktion zu mappen – so können Sie notify: webserver restart verwenden, ohne den genauen Service-Namen zu kennen.

Variablen – vars & defaults

vars/main.yml · defaults/main.yml · Priorität
# defaults/main.yml (niedrigste Priorität) --- nginx_port: 80 nginx_root: /var/www/html # vars/main.yml (höhere Priorität) nginx_worker_processes: 4

Variablen in Roles werden in defaults/ und vars/ definiert. defaults/ hat die niedrigste Priorität und kann leicht überschrieben werden – ideal für Standardwerte.

Beispiele
# defaults/main.yml – Standardwerte
---
app_port: 3000
app_user: appuser
app_env: production
# vars/main.yml – Werte mit höherer Priorität
---
app_port: 8080 # Überschreibt defaults
app_debug: false
# Überschreiben in der Playbook-Definition
roles:
- role: webserver
vars:
app_port: 9090 # Höchste Priorität
Tipp: Die Priorität von Variablen in Rollen (niedrig nach hoch): defaults/ < vars/ < Playbook vars < Inventory host_vars < Befehlszeile (-e). So können Sie Rollen flexibel konfigurieren.

templates – Jinja2-Templates

templates/ · .j2 · template-Modul
# templates/nginx.conf.j2 server { listen {{ nginx_port }}; root {{ nginx_root }}; server_name {{ ansible_fqdn }}; }

templates enthalten Jinja2-Vorlagen für Konfigurationsdateien. Sie werden mit dem template-Modul auf die Zielsysteme übertragen und dynamisch mit Variablen befüllt.

Beispiele
# templates/nginx.conf.j2
user {{ nginx_user | default('www-data') }};
worker_processes {{ nginx_worker_processes | default(1) }};
events {
worker_connections {{ nginx_worker_connections | default(1024) }};
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
{% for site in nginx_sites %}
server {
listen {{ site.port }};
server_name {{ site.domain }};
root {{ site.root }};
}
{% endfor %}
}
Tipp: Templates können alle Jinja2-Features nutzen – Schleifen, Bedingungen, Filter und Variablen. Verwenden Sie | default('wert'), um Fallback-Werte zu definieren.

meta – Metadaten & Abhängigkeiten

meta/main.yml · dependencies · galaxy_info
# meta/main.yml --- galaxy_info: author: ihrname description: Nginx Webserver Rolle platforms: - name: Ubuntu - name: Debian dependencies: - role: common - role: firewall

meta enthält Metadaten für die Rolle – Autor, Beschreibung, unterstützte Plattformen und vor allem Abhängigkeiten zu anderen Rollen.

Beispiele
# meta/main.yml – Galaxy-Informationen
---
galaxy_info:
author: ihr-team
description: PostgreSQL Datenbank Rolle
license: MIT
min_ansible_version: 2.9
platforms:
- name: Ubuntu
versions:
- 20.04
- 22.04
dependencies:
- role: common
- role: monitoring
when: inventory_hostname in groups['monitoring']
- role: postgresql-backup
vars:
backup_enabled: true
Tipp: Mit dependencies können Sie sicherstellen, dass abhängige Rollen automatisch ausgeführt werden. Ansible Galaxy nutzt galaxy_info für die Metadaten bei der Veröffentlichung von Rollen.

Ansible Roles Best Practices

DRY Wiederverwendung durch Roles
Don't Repeat Yourself
Defaults Standardwerte in defaults/ setzen
Einfach überschreibbar
Templates Konfigurationen dynamisch generieren
Jinja2 in templates/
Handlers Service-Neustarts am Ende
Nur bei Änderungen
Meta Abhängigkeiten und Metadaten
Galaxy-kompatibel
Idempotenz Tasks mehrfach ausführbar
Keine unerwarteten Änderungen

Quick Summary

init
Rolle erstellen
tasks
Aufgaben
handlers
Handler
vars
Variablen
templates
Templates
meta
Metadaten
ansible-galaxy init webserver · roles: - role: webserver · notify: nginx restart