Einfache Ansible-Beispiele

Die sehr ausführliche Dokumentation von Ansible lässt keine Fragen offen, erschlägt Neulinge allerdings auch mit ihrem Umfang. Im Folgenden präsentieren wir minimale Beispiele für den Umgang mit Ansible, um Ihnen einen schnellen Überblick zu verschaffen.

Der erste Schritt zur Verwendung von Ansible ist das Erzeugen einer Liste mit den zu verwaltenden Systemen, eines sogenannten Inventories. Neben diversen dynamischen Datenquellen lassen sich dafür Dateien verwenden. Beispielsweise könnten zwei Mailserver von axxeo in einer Datei mit dem Namen hosts aufgeführt werden:

mx1.axxeo.de
mx2.axxeo.de

1. Ansible Ad-Hoc-Kommandos

Mit sogenannten Ansible Ad-Hoc-Kommandos ist es möglich, Kommandos auf den aufgeführten Systemen auszuführen:

ansible -i hosts all -a uptime

Damit wird auf allen (all) in der Datei hosts (-i hosts) definierten Systemen das Kommando “uptime” ausgeführt. Natürlich sind hier beliebige Kommandos möglich.

2. Ansible Module

Ansible bietet eine immense Anzahl von Modulen für verschiedenste Einsatzzwecke. Einen Überblick erhalten Sie unter Module Index.

Die Verwendung von Ansible-Modulen ist dem Ausführen von Shell-Kommandos vorzuziehen.

Um z. B. die lokale Datei /etc/hosts auf alle Systeme in das Verzeichnis /tmp zu kopieren, kann das copy-Modul als Ad-Hoc-Kommando verwendet werden:

ansible -i hosts all -m copy -a "src=/etc/hosts dest=/tmp/hosts"

Die nach -a angegebenen Parameter beziehen sich auf das mit -m ausgewählte Modul, hier “copy”. Der Parameter src gibt die lokale Datei an, der Parameter dest die Datei auf dem Zielsystem. Die möglichen Parameter für das copy-Modul und weitere Beispiele sind unter Copy Module zu finden.

3. Ansible Tasks und Playbooks

Wiederkehrende Aufgaben wie das Aufsetzen oder Anpassen/Aktualisieren von Systemen werden in sogenannten Playbooks definiert. Ein Playbook ist eine Sammlung von Parametern und Tasks (Aufgaben) im YAML-Format. YAML ist eine sehr einfache Sprache, siehe auch Wikipedia.

Das folgende Beispiel ist für Debian-Systeme geeignet. Es führt ein Systemupgrade auf allen Systemen durch und installiert danach eine neue Version der Datei /etc/motd. Die Aufgaben werden in eine Datei geschrieben, hier dist-upgrade.yml:

- name: Run dist-upgrade and copy /etc/motd 
  hosts: all 
  tasks: 
 
  - name: Run dist-upgrade 
    apt: 
      upgrade: dist 
      update_cache: yes 
 
  - name: Copy /etc/motd 
    copy: 
      src: /etc/motd 
      dest: /etc/motd

Im ersten Task wird das apt-Modul verwendet, um die Liste der Paketquellen zu aktualisieren (update_cache: yes) und ein Distributions-Update durchzuführen (upgrade:dist).

Anschließend wird im zweiten Task das copy-Modul verwendet, um die lokale Datei /etc/motd auf alle Systeme zu kopieren.

Playbooks werden mit dem Kommando ansible-playbook ausgeführt:

ansible-playbook -i hosts dist-upgrade.yml

4. Weitere Ansible-Tipps und beste Vorgehensweisen (best practices)

Wenn Playbooks umfangreicher werden oder viele Systeme zu bearbeiten sind, bieten sich weitere Kommandozeilenparameter an, um Abläufe zu beschleunigen oder nur auf einem Teil der definierten Systeme zu arbeiten.

4.1 Limitierung auf bestimmte Systeme

Durch

ansible-playbook -i hosts site.yml -l mx*

wird das Playbook site.yml nur auf die Systeme angewendet, deren Namen mit “mx” beginnen.

4.2 Beschränken auf bestimmte Aufgaben

Einzelnen Tasks können Tags (Markierungen) gegeben werden, um nur bestimmte Tasks auszuführen. Hier wird der Tag “copy” gesetzt:

- name: Copy /etc/motd 
    copy: 
      src: /etc/motd 
      dest: /etc/motd 
    tags: copy

Mit

ansible-playbook -i hosts site.yml -t copy

werden nur die Tasks ausgeführt, deren Tags die Zeichenkette “copy” beinhalten.

4.3 Einzelschrittmodus und Start bei einem bestimmten Task

Die Parameter –start-at-task und –step können verwendet werden, um die Verarbeitung bei einem bestimmten Task zu starten und schrittweise abzuarbeiten:

ansible-playbook -i hosts site.yml --start-at-task="Copy /etc/motd" --step

4.4 Testlauf und Unterschiede anzeigen

Weitere wichtige Parameter sind –check und –diff.

Mit –check werden keine Änderungen auf den Zielsystemen durchgeführt, es wird lediglich angezeigt, welche Tasks ausgeführt würden. Mit –diff werden Änderungen in Dateien angezeigt:

ansible-playbook -i hosts site.yml --check --diff

4.5 Weitere Informationen

Unter Getting Started ist eine tiefgehende Einführung in Ansible zu finden. Playbooks werden unter Working With Playbooks erläutert.

Bei der Erstellung von umfangreichen Playbooks empfiehlt es sich, Tasks in Rollen (Roles) auszugliedern, damit deren Wiederverwendbarkeit erleichtert wird. Eine Einführung in Rollen findet sich unter Roles.

Mögliche Verzeichnisstrukturen für größere Ansible-Projekte werden unter Best Practices vorgestellt.