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)
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:
Ansible auf dem lokalen System installiert
Docker & Docker Compose auf den Zielsystemen (alternativ automatisiert mit Ansible)
Für Hosts:
SSH-Zugriff zu allen Ziel-Hosts eingerichtet
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:
Installation von Docker und Docker Compose
Bereitstellung zweier Apache-Container auf den Webservern
Konfiguration einer HTML-Datei mit der Überschrift
Hallo DVA PraktikumEinrichtung 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:
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:
Nun sollte auch in Docker das Cluster sichtbar sein und die Seite über den Loadbalancer erreichbar sein.
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¶
[Docker] (https://www.docker.com/what-docker)
[Docker Compose](https://docs.docker.com/compose/)
[Docker Desktop](https://docs.docker.com/desktop/)
[Ansible](https://docs.ansible.com/)