Aufbau der Playbooks, die Syntax und die wichtigsten Elemente

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 du localhost 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) oder yum (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 und command: 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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert