5. Docker Container Cluster Deployment mit Ansible

5.1. Projekt

Im Projekt werden wir über Ansible verschiedene Skripte erstellen bzw. Analysieren. Eines der Skripte erstellt ein einfaches Docker-Cluster bestehend aus zwei Apache-Webservern und einem NGINX-Load-Balancer. Ziel ist es, auf den Webservern eine HTML-Seite mit der Überschrift Hallo DVA Praktikum bereitzustellen und über den loadbalancer auf diese Seiten zugreifen zu können. Ein weiteres Skript ist für die automatische Einrichtung neuer Macbooks geeignet.

5.2. Ansible

Ansible ist ein Open-Source-Automatisierungstool zur Verwaltung und Konfiguration von IT-Infrastruktur. Es nutzt einfache YAML-Dateien (Playbooks), um Aufgaben wie Software-Installation, Systemkonfiguration oder das Ausrollen von Anwendungen wiederholbar und automatisiert auf mehreren Servern durchzuführen – ohne Agent auf den Zielsystemen, sondern per SSH.

5.3. Docker

Docker ist eine Plattform, mit der Anwendungen und ihre Abhängigkeiten in Container verpackt und ausgeführt werden. Container sind leichtgewichtige, isolierte Umgebungen, die sich auf jedem System gleich verhalten – unabhängig vom Betriebssystem oder der Infrastruktur. Eine vereinfachte Darstellung der Vorteile von Docker gegenüber Virtuellen Maschinen :

(https://www.opc-router.de/wp-content/uploads/2021/10/Docker_Vergleich_DE.png)

Docker vs VM

5.4. Skript 1 - Loadbalancer

5.4.1. Übersicht

Das Setup besteht aus drei Containern oder Hosts:

  • web1: Apache Webserver

  • web2: Apache Webserver

  • lb: NGINX Load Balancer

Der Load Balancer verteilt HTTP-Anfragen auf die beiden Webserver.

5.4.2. Voraussetzungen

Vor der Ausführung des Playbooks müssen folgende Voraussetzungen erfüllt sein:

  1. Ansible auf dem lokalen System installiert

  2. Docker & Docker Compose auf den Zielsystemen (alternativ automatisiert mit Ansible)

Für Hosts:

  1. SSH-Zugriff zu allen Ziel-Hosts eingerichtet

  2. Zielsysteme basieren auf Ubuntu/Debian oder kompatiblen Distributionen

5.4.3. Vorbereitung

Ubuntu/Debian:

sudo apt update
sudo apt install -y ansible python3-pip
pip3 install docker docker-compose

MacOS:

brew install ansible
pip3 install docker docker-compose

SSH-Zugriff für Hosts vorbereiten:

ssh-keygen -t rsa -b 4096
ssh-copy-id user@<ip-des-zielsystems>

5.4.4. Inventar (für Hosts)

Die Datei inventory.ini definiert die Hosts:

[webservers]
web1 ansible_host=<IP-Adresse web1> ansible_user=<user>
web2 ansible_host=<IP-Adresse web2> ansible_user=<user>

[loadbalancer]
lb ansible_host=<IP-Adresse LB> ansible_user=<user>

5.4.5. Playbook

Das Playbook deploy_docker_cluster.yml erledigt folgende Aufgaben:

  1. Installation von Docker und Docker Compose

  2. Bereitstellung zweier Apache-Container auf den Webservern

  3. Konfiguration einer HTML-Datei mit der Überschrift Hallo DVA Praktikum

  4. Einrichtung eines NGINX-Containers als Load Balancer mit statischer Konfiguration

Das Playbook local_cluster.yml macht es ähnlich, jedoch installiert er die Container auf dem lokalen Host in einem Docker Netzwerk.

HTML-Datei

<html>
  <body>
    <h1>Hallo DVA Praktikum</h1>
  </body>
</html>

Auszug aus dem Webserver-Docker Compose File:

services:
  apache:
    image: httpd:latest
    container_name: apache
    volumes:
      - "/opt/docker/html:/usr/local/apache2/htdocs"
    ports:
      - "80:80"

NGINX-Load-Balancer-Konfiguration:

http {
  upstream backend {
    server web1:80;
    server web2:80;
  }
  server {
    listen 80;
    location / {
      proxy_pass http://backend;
    }
  }
}

5.4.6. Verbindungstest

Bevor man die Ansible Playbooks starten kann sollte man die Verbindung der Hosts aus der inventory.ini testen.

Ausführung des Tests:

ansible -i inventory.ini all -m ping

Ein erfolgreicher Test gibt z. B. zurück:

web1 | SUCCESS => {
 "ansible_facts": {
     "discovered_interpreter_python": "/usr/bin/python3.10"
 },
 "changed": false,
 "ping": "pong"
}

Die Ausgabe des Verbindungstests:

Verbindungstest

5.4.7. Playbook ausführen

Um das Cluster auf verschiedenen Hosts bereitzustellen, wird das Ansible-Playbook wie folgt ausgeführt:

ansible-playbook -i inventory.ini deploy_docker_cluster.yml

Nach der Ausführung ist die Seite über den Load Balancer unter http://<loadbalancer-ip> erreichbar.

Für die lokale benutzung ist Folgender Befehl der richtige:

ansible-playbook local_cluster.yml

Die Seite ist dann unter http://localhost:8080 erreichbar.

Das deployment über Ansible sieht folgendermaßen aus:

Ansible Deployment

Nun sollte auch in Docker das Cluster sichtbar sein und die Seite über den Loadbalancer erreichbar sein.

Cluster

5.5. Skript 2 - MacOS Installation

5.5.1. Ergänzende Anwendung: macOS-Konfiguration mit Ansible

Neben der Bereitstellung verteilter Systeme kann Ansible auch lokal eingesetzt werden – etwa zur automatisierten Einrichtung eines macOS-Entwicklungsrechners.

Ein Beispiel dafür ist das Projekt mac-dev-playbook, das auf Ansible-Rollen basiert und speziell für macOS konzipiert wurde. Es erlaubt die vollständige Einrichtung eines Entwickler-Macs mit nur wenigen Befehlen – ideal für Neuinstallationen, Rechnerwechsel oder Team-Onboarding.

5.5.2. Grundidee und Vorgehen

Das Playbook arbeitet deklarativ: In einer zentralen Konfigurationsdatei namens config.yml wird beschrieben, was auf dem System eingerichtet werden soll. Diese Datei legt fest, welche Tools, Anwendungen und Einstellungen umgesetzt werden – sauber getrennt und versionierbar.

Nach dem Klonen des Projekts und dem Anpassen der Konfigurationsdatei genügt ein einzelner Aufruf, um den Rechner vollständig aufzusetzen:

ansible-playbook main.yml -i inventory

5.5.3. Homebrew-Pakete installieren

Ein zentraler Bestandteil der Konfiguration ist die Installation von Homebrew-Paketen. In der Konfigurationsdatei können beliebige Tools eingetragen werden, die dann automatisch installiert werden – beispielsweise:

homebrew_installed_packages:
   - git
   - node
   - python
   - docker
   - jq
   - wget

Auch grafische Anwendungen können über Homebrew Cask installiert werden:

homebrew_cask_apps:
   - visual-studio-code
   - iterm2
   - slack
   - firefox

5.5.4. Mac App Store-Anwendungen

Das Playbook unterstützt auch die Installation von Apps aus dem Mac App Store, indem deren IDs angegeben werden:

mas_installed_apps:
   - { id: 497799835, name: "Xcode" }
   - { id: 409203825, name: "Numbers" }
   - { id: 409201541, name: "Pages" }

5.5.5. Systemkonfigurationen und Dock-Anpassung

Neben Software lassen sich auch systemweite Einstellungen automatisieren. So können z. B. Dock-Einträge angepasst oder das Verhalten des Docks verändert werden:

configure_dock: true
dockitems_remove:
   - Safari
   - Mail
   - Contacts
dockitems_persist:
   - name: "Visual Studio Code"
      path: "/Applications/Visual Studio Code.app"
   - name: "iTerm"
      path: "/Applications/iTerm.app"

5.5.6. Zusätzliche Optionen: Terminal, Sudo, Dotfiles

Wer möchte, kann darüber hinaus viele weitere Dinge konfigurieren. Beispielsweise:

  • Terminal-Einstellungen

  • sudoers-Konfiguration für passwortlosen Zugriff auf bestimmte Befehle

  • Einbinden persönlicher dotfiles (z. B. .bashrc, .zshrc)

Diese Bereiche lassen sich einzeln über Konfigurationsflags aktivieren oder deaktivieren:

configure_terminal: true
configure_sudoers: false
configure_dotfiles: true

5.6. Fazit

Dies demonstriert, wie mit einfachen Mitteln ein skalierbares Docker-Cluster mithilfe von Ansible aufgebaut werden kann bzw. neue oder bestehende Macs strukturiert, konsistent und vollständig automatisiert eingerichtet werden können. Alles, was einmal konfiguriert wurde, ist wiederverwendbar – für neue Systeme, neue Teammitglieder oder bei einem Clean Install. Das kann einiges an Konfigurationsarbeiten ersparen.

5.7. Quellen