Ansible ist ein leistungsstarkes Automatisierungstool, das häufig für IT-Prozesse wie Konfigurationsmanagement, Anwendungsbereitstellung und Orchestrierung verwendet wird. Im Mittelpunkt von Ansible steht das Playbook – eine YAML-Datei, die Aufgaben beschreibt und diese auf verwalteten Hosts ausführt. In diesem Blog-Beitrag erklären wir die Grundlagen von Ansible-Playbooks, die Syntax und die wichtigsten Elemente, die du kennen musst, um effektiv mit Ansible zu arbeiten.
Was ist ein Playbook?
Ein Playbook ist das Herzstück jeder Ansible-Automatisierung. Es enthält eine Liste von Plays (Abläufen), die sich wiederum aus einer Reihe von Tasks (Aufgaben) zusammensetzen. Jeder Task führt eine spezifische Aktion aus, z. B. das Installieren eines Pakets, das Erstellen einer Datei oder das Starten eines Dienstes. Playbooks sind deklarativ, d. h. sie beschreiben den gewünschten Endzustand der Systeme und Ansible sorgt dafür, dass dieser erreicht wird.
Die Grundstruktur eines Playbooks
Ein einfaches Playbook besteht typischerweise aus einer oder mehreren Play-Einheiten. Ein Play enthält Informationen darüber, welche Hosts betroffen sind, und eine Reihe von Aufgaben, die auf diesen Hosts ausgeführt werden sollen.
Hier ist ein Beispiel für ein minimalistisches Playbook:
---
- hosts: webserver
become: yes
tasks:
- name: Installiere Apache
apt:
name: apache2
state: present
- name: Starte den Apache-Dienst
service:
name: apache2
state: started
Wichtige Playbook-Elemente
1. hosts
Das Schlüsselwort hosts
gibt an, auf welchen Systemen die in den Tasks definierten Aktionen ausgeführt werden sollen. Dies kann eine Gruppe von Hosts oder ein einzelner Host sein. Die Hosts werden in der Inventory-Datei definiert.
- hosts: webserver
localhost
: Um das Playbook auf deinem eigenen System (dem Controller) auszuführen, kannst dulocalhost
verwenden.- Hostgruppen: Du kannst Gruppen in deiner Inventory-Datei definieren, z. B.
webserver
,dbserver
,all
.
2. tasks
Der Abschnitt tasks
enthält eine Liste von Anweisungen, die auf den angegebenen Hosts ausgeführt werden sollen. Jede Aufgabe verwendet ein Ansible-Modul, z. B. apt
, yum
, service
, file
usw., um eine bestimmte Aktion auszuführen. Eine typische Task besteht aus einem Namen und einer Moduldefinition.
tasks:
- name: Installiere Apache
apt:
name: apache2
state: present
3. name
Das name
-Feld beschreibt die Aufgabe. Es dient der Dokumentation und wird während der Playbook-Ausführung in der Ausgabe angezeigt. Es hilft zu verstehen, welche Aktion gerade ausgeführt wird.
- name: Starte den Apache-Dienst
service:
name: apache2
state: started
4. become
Das Schlüsselwort become
ermöglicht es dir, Aufgaben als ein anderer Benutzer auszuführen – in der Regel als root oder ein Benutzer mit erweiterten Rechten. Wenn du Administratorrechte benötigst, um bestimmte Befehle auszuführen (z. B. die Installation von Paketen), kannst du become: yes
verwenden, um die Aufgaben mit erhöhten Rechten auszuführen.
- hosts: webserver
become: yes
5. vars
Der Abschnitt vars
erlaubt es dir, Variablen in deinem Playbook zu definieren. Variablen machen dein Playbook flexibler und wiederverwendbarer, da du dieselben Aufgaben auf unterschiedlichen Hosts mit variierenden Werten ausführen kannst.
- hosts: webserver
vars:
apache_port: 8080
tasks:
- name: Konfiguriere Apache
lineinfile:
path: /etc/apache2/ports.conf
regexp: '^Listen'
line: "Listen {{ apache_port }}"
state: present
In diesem Beispiel wird der Wert der Variablen apache_port
verwendet, um den Apache auf Port 8080 zu konfigurieren.
Module: Das Herzstück von Tasks
Ansible-Module sind vorkonfigurierte Skripte, die Ansible-Tasks definieren. Sie übernehmen die tatsächliche Arbeit auf den verwalteten Hosts. Hier sind einige der am häufigsten verwendeten Module:
apt
(für Debian-basierte Systeme) oderyum
(für Red Hat-basierte Systeme): Installiert und verwaltet Pakete.
- name: Installiere Apache auf einem Debian-System
apt:
name: apache2
state: present
service
: Startet, stoppt oder aktiviert einen Dienst.
- name: Starte den Apache-Dienst
service:
name: apache2
state: started
copy
: Kopiert Dateien von deinem Controller-Node auf die Ziel-Hosts.
- name: Kopiere eine HTML-Datei auf den Server
copy:
src: /path/to/index.html
dest: /var/www/html/index.html
file
: Verwaltet Dateirechte und Dateieigenschaften.
- name: Erstelle ein Verzeichnis
file:
path: /var/www/html
state: directory
mode: '0755'
shell
undcommand
: Führen Shell-Befehle auf dem Remote-Host aus.
- name: Führe einen Shell-Befehl aus
shell: echo "Hello World" >> /tmp/hello.txt
Bedingte Aufgaben
In Ansible kannst du Aufgaben bedingt ausführen, indem du das Schlüsselwort when
verwendest. Dies ist nützlich, wenn du bestimmte Aufgaben nur ausführen möchtest, wenn bestimmte Bedingungen erfüllt sind.
- hosts: webserver
tasks:
- name: Installiere Apache nur auf Ubuntu
apt:
name: apache2
state: present
when: ansible_facts['os_family'] == 'Debian'
In diesem Beispiel wird Apache nur auf Debian-basierten Systemen installiert.
Schleifen (Loops)
Schleifen erlauben es dir, eine Aufgabe mehrfach für unterschiedliche Werte oder Elemente auszuführen. Das Schlüsselwort loop
ermöglicht die Verwendung von Schleifen in Ansible.
- hosts: webserver
tasks:
- name: Installiere mehrere Pakete
apt:
name: "{{ item }}"
state: present
loop:
- apache2
- curl
- git
Dieses Beispiel installiert mehrere Pakete in einer einzigen Aufgabe.
Handler
Handler sind spezielle Tasks, die nur ausgeführt werden, wenn sie von einer anderen Aufgabe „benachrichtigt“ werden. Dies ist hilfreich, um z. B. Dienste nach einer Konfigurationsänderung neu zu starten.
- hosts: webserver
tasks:
- name: Konfigurationsdatei ändern
template:
src: templates/apache.conf.j2
dest: /etc/apache2/apache2.conf
notify: Restart Apache
handlers:
- name: Restart Apache
service:
name: apache2
state: restarted
In diesem Beispiel wird der Handler Restart Apache
nur dann aufgerufen, wenn die Konfigurationsdatei geändert wurde.
Rollen (Roles)
Roles sind eine Möglichkeit, Playbooks in wiederverwendbare, strukturierte und modularisierte Teile zu zerlegen. Sie helfen dabei, große Projekte zu organisieren und erleichtern die Wiederverwendung von Code.
Die Struktur einer Role könnte folgendermaßen aussehen:
roles/
├── webserver/
│ ├── tasks/
│ │ └── main.yml
│ ├── templates/
│ │ └── apache.conf.j2
│ ├── handlers/
│ │ └── main.yml
│ └── vars/
│ └── main.yml
Fazit
Ansible-Playbooks sind eine einfache, aber leistungsstarke Möglichkeit, komplexe IT-Aufgaben zu automatisieren. Sie sind deklarativ, flexibel und leicht verständlich. In diesem Tutorial haben wir die grundlegende Syntax eines Playbooks, die wichtigsten Elemente wie Tasks, Variablen, Bedingungen und Schleifen sowie die Verwendung von Modulen behandelt.
Mit diesen Grundlagen bist du bereit, eigene Playbooks zu schreiben und damit verschiedene Automatisierungsaufgaben in deiner IT-Umgebung durchzuführen. Viel Spaß beim Experimentieren und Automatisieren mit Ansible!