Einführung
Rollen bündeln Standardwerte, Aufgaben, Vorlagen, Dateien und Handler in einer wiederverwendbaren Struktur. Sie halten Playbooks kurz und erleichtern die gemeinsame Nutzung von Automatisierungslösungen.
In diesem Lab erstellen Sie manuell eine Rolle, fügen Standardwerte, eine Vorlage sowie Aufgaben hinzu und wenden diese anschließend auf zwei Host-Aliase an.
Ein Rollen-Übungsprojekt erstellen
In diesem Schritt erstellen Sie ein Projekt mit einem Verzeichnis für Rollen sowie zwei lokalen Web-Host-Aliasen.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
roles_path = ./roles
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF
Die Einstellung roles_path = ./roles teilt Ansible mit, wo nach Rollennamen gesucht werden soll, die von Playbooks verwendet werden. Ohne diese Einstellung würde Ansible möglicherweise nur in systemweiten oder benutzerspezifischen Rollenpfaden suchen.
Die Verzeichnisstruktur der Rolle erstellen
In diesem Schritt erstellen Sie die wichtigsten Verzeichnisse für die Rolle. defaults speichert Variablen mit niedriger Priorität, tasks enthält die Logik der Aufgaben und templates beherbergt Jinja2-Vorlagen.
Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück. Dies stellt sicher, dass die Befehle stabil bleiben, auch wenn LabEx jeden Schritt separat ausführt.
cd /home/labex/project/rhce-ansible
mkdir -p roles/web_banner/{defaults,tasks,templates}
find roles/web_banner -maxdepth 2 -type d | sort
Die Ausgabe sollte das Wurzelverzeichnis der Rolle sowie die Ordner defaults, tasks und templates anzeigen. Diese Namen haben für Ansible eine spezifische Bedeutung; so ist beispielsweise tasks/main.yml der Einstiegspunkt für die Aufgaben der Rolle.
Rollen-Standardwerte und eine Vorlage hinzufügen
In diesem Schritt fügen Sie Standardvariablen und eine Vorlage hinzu. Die Rolle verwendet diese Werte, sofern sie nicht durch ein Playbook oder das Inventory überschrieben werden. Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.
cd /home/labex/project/rhce-ansible
cat > roles/web_banner/defaults/main.yml <<'EOF'
---
banner_message: Welcome to RHCE Ansible Prep
EOF
cat > roles/web_banner/templates/banner.txt.j2 <<'EOF'
Host: {{ inventory_hostname }}
Message: {{ banner_message }}
EOF
Standardwerte sind Rollenvariablen mit niedriger Priorität. Sie stellen der Rolle einen nutzbaren Wert zur Verfügung, wenn das Playbook oder das Inventory keinen bereitstellt, ermöglichen es dem Aufrufer jedoch, diesen später zu überschreiben.
cat roles/web_banner/defaults/main.yml roles/web_banner/templates/banner.txt.j2
Die Vorlage kombiniert den aktuellen Host-Alias mit der Standardnachricht. Wenn die Rolle für zwei Hosts ausgeführt wird, sollte dieselbe Vorlage zwei unterschiedliche Host:-Zeilen rendern.
Rollenaufgaben hinzufügen und die Rolle anwenden
In diesem Schritt fügen Sie die Datei tasks/main.yml sowie ein Playbook hinzu, das die Rolle anwendet. Die Rolle erstellt ein Host-Verzeichnis und rendert eine Banner-Datei pro Host.
Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.
cd /home/labex/project/rhce-ansible
cat > roles/web_banner/tasks/main.yml <<'EOF'
---
- name: Ensure host banner directory exists
ansible.builtin.file:
path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
state: directory
mode: '0755'
- name: Render host banner
ansible.builtin.template:
src: banner.txt.j2
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
mode: '0644'
EOF
cat > playbooks/apply-role.yml <<'EOF'
---
- name: Apply reusable web banner role
hosts: web
gather_facts: false
roles:
- role: web_banner
EOF
Die Datei mit den Rollenaufgaben enthält die Implementierung, während playbooks/apply-role.yml kurz bleibt und lediglich die Rolle benennt. Dies ist der Hauptvorteil von Rollen: eine wiederverwendbare Struktur, ohne dass jede Aufgabe in jedem Playbook wiederholt werden muss.
ansible-playbook playbooks/apply-role.yml --syntax-check
Das rollenbasierte Playbook ausführen
In diesem Schritt führen Sie das Playbook aus und überprüfen die gerenderten Dateien. Das Playbook bleibt kurz, da die Rolle die wiederverwendbare Implementierung enthält. Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/apply-role.yml | tee reports/role-run.txt
Der Durchlauf sollte die Rolle einmal pro Host-Alias in der Gruppe web ausführen. Eine erfolgreiche Zusammenfassung mit failed=0 bedeutet, dass die Rolle über den roles_path gefunden wurde und ihre Aufgaben abgeschlossen wurden.
cat managed/web1/banner.txt managed/web2/banner.txt
Die gerenderten Dateien sollten dieselbe Nachricht enthalten, aber unterschiedliche Host:-Zeilen aufweisen. Dies beweist, dass die Rolle dieselbe Logik wiederverwendet und dennoch hostspezifische Daten korrekt rendert.
Zusammenfassung
Sie haben eine wiederverwendbare Rollenstruktur erstellt, Standardwerte, Aufgaben und eine Vorlage hinzugefügt, die Rolle über ein Playbook angewendet und die gerenderte Ausgabe überprüft.


