Konfigurations-Verwaltung mittels ansible

Ansible ist ein Konfigurations-Verwaltungs-Programm, mit dessen Hilfe es möglich ist, von einem Computer aus Installations- und Konfigurations-Routinen simultan auf beliebig vielen anderen Rechnern auszuführen. Die Voraussetzung dafür ist lediglich, dass der auf dem Tower angemeldete Benutzer sich via SSH auf den anderen Rechnern anmelden kann und dort gegebenenfalls SuperUser-Rechte bekommen kann. Auf den Clients selbst muss keine weitere Software installiert werden.

Der grundlegende Workflow von Ansible ist also folgender:

  • Auf einem Hauptrechner („Tower“) werden einzelne Routinen („Tasks“) definiert, die dann auf den Zielrechnern („Hosts“) ausgeführt werden sollen.
  • Die einzelnen Hosts werden beim Aufruf von Ansible via SSH kontaktiert. Anstelle der manuellen Eingabe von Passwörtern werden dabei meist SSH-Schlüssel verwendet.

Ein Vorteil von Ansible ist es, dass es erst die vorliegenden Bedingungen prüft, bevor es irgendwelche Routinen aufruft. Sind beispielsweise die gewünschten Programme bereits installiert oder die entsprechenden Konfigurationsdateien angepasst, so bedeutet dies, dass ein erneuter Aufruf einer Ansible-Task keine weiteren Veränderungen mit sich bringt (beispielsweise kann so vermieden werden, dass Server-Dienste erneut gestartet werden, wenn sie bereits aktiv sind).

Unter Debian/Ubuntu/LinuxMint kann Ansible folgendermaßen installiert werden:

sudo aptitude install ansible

Zielserver festlegen

Nach der Installation befindet sich in der Konfigurationsdatei /etc/ansible/hosts eine Beispiel-Liste von Servern, auf denen Installationen beziehungsweise Konfigurationen vorgenommen werden sollen. Die einzelnen Ziel-Rechner können optional (mittels einer einfachen YAML-Syntax) gruppiert und mit einem Label versehen werden. Eine solche Server-Liste kann beispielsweise folgendermaßen aussehen:

[myweb]
192.168.2.11
192.168.2.12

Für die Festlegung der Zielrechner und der einzelnen Tasks ist es empfehlenswert, ein eigenes lokales Verzeichnis anzulegen, das auch ohne SuperUser-Rechte verwaltet werden kann:

mkdir ~/ansible
cp /etc/ansible/hosts ~/ansible/hosts

Beim Aufruf von ansible kann der Pfad der gewünschten Hosts-Datei mittels der Option -i hostfile explizit angegebenen werden. Möchte man allerdings, dass Ansible standardmäßig auf die Host-Datei im Verzeichnis ~/ansible zurückgreift, so kann man folgende Zeile in einer Shell eingeben (oder diese am Ende der Konfigurationsdatei ~/.bashrc beziehungsweise ~/.zshrc einfügen):

export ANSIBLE_HOSTS=~/ansible/hosts

Diese Hosts-Datei kann nun auch ohne SuperUser-Rechte nach Belieben angepasst werden. Zu Test-Zwecken kann man beispielsweise auch ein virtuelles Betriebsystem einrichten und die Ansible-Tasks auf diesem ablaufen lassen. Hierzu sollte die Server-Liste um folgenden Eintrag ergänzt werden:

[local]
127.0.0.1

Auf diese Weise kann man Ansible ausprobieren, ohne Änderungen auf anderen Rechnern durchzuführen. Die Anmeldung auf dem virtuellen Betriebsystem erfolgt allerdings mittels Benutzername und Passwort, nicht mittels SSH-Schlüsseln.

Tasks und Playbooks

Bei der Verwendung von Ansible wird angegeben, welchen „Status“ das Zielsystem haben sollte. Ansible führt dann (und nur dann) einzelne Routinen aus, bis der Soll-Status erreicht ist.

Die auszuführenden Tasks können ebenfalls in einer YAML-Datei (‚Playbook‘) abgelegt werden. So kann man beispielsweise eine Datei ~/ansible/upgrade-servers.yml mit folgendem Inhalt anlegen:

- hosts: myweb
  sudo: true
  tasks:
    - name: update apt sources
      apt:  update_cache=yes

   - name: upgrade apt packages
     apt:  upgrade=yes

Hat man Netzwerk-Zugriff auf den/die Host-Computer Netzwerk-Zugriff und kann auf diesen SuperUser-Rechte erlangen, so kann man anschließend Ansible mit folgender Anweisung aufrufen:

ansible-playbook ~/ansible/upgrade-server.yml -u -K

Durch die Option -u wird der Benutzer auf dem entfernten Rechner festgelegt, durch die Option -K wird nach dem jeweiligen Passwort gefragt.

Ansible-Module

Zum Durchführen der einzelnen Tasks bietet Ansible einige Module, die jeweils Funktion für bestimmte Aufgaben bereitstellen. Das wohl einfachste Modul heißt command, und erlaubt das Ausführen einer gewöhnlichen Shell-Anweisung. Auch ohne Definition eines Playbooks kann man dies beispielsweise folgendermaßen nutzen:

# Shell-Anweisung via Ansible ausführen:
ansible myweb -m command -a "uptime"

Durch die Option -m wird ein Modulname angegeben, mit -a wird ein Kommandozeilen-Argument für dieses Modul übergeben (mittels -u username könnte zudem wiederum ein Benutzername angegeben werden, mit dem man sich via SSH bei den Zielrechnern anmelden möchte).

Anstelle einer einzelnen Anweisung kann man auch ein Shell-Skript mittels Ansible ausführen lassen. Ein solches könnte beispielsweise folgenden Inhalt haben:

#!/bin/bash

# Filename: script-example.sh

uptime
echo "Hello World!"

Speichert man dieses Mini-Skript als Datei script-example.sh, so kann man das Ansible-Modul script nutzen, um es auf den Zielrechnern auszuführen:

# Shell-Skript via Ansible ausführen:
ansible myweb -m script -a script-example.sh

Wiederum wird mit der Option -m der Modulname angegeben, und mit der Option -a der Name des Skripts als zusätzliches Argument.

… to be continued …

Links