Docker Container Cluster Deployment mit Ansible =============================================== 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. 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. 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) .. image:: ./img/project5/docker_vergleich.png :alt: Docker vs VM Skript 1 - Loadbalancer ------------------------ Ü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. 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: 3. **SSH-Zugriff** zu allen Ziel-Hosts eingerichtet 4. Zielsysteme basieren auf Ubuntu/Debian oder kompatiblen Distributionen Vorbereitung ^^^^^^^^^^^^^ **Ubuntu/Debian:** .. code-block:: bash sudo apt update sudo apt install -y ansible python3-pip pip3 install docker docker-compose **MacOS:** .. code-block:: bash brew install ansible pip3 install docker docker-compose SSH-Zugriff für Hosts vorbereiten: .. code-block:: bash ssh-keygen -t rsa -b 4096 ssh-copy-id user@ Inventar (für Hosts) ^^^^^^^^^^^^^^^^^^^^^^^^ Die Datei ``inventory.ini`` definiert die Hosts: .. code-block:: ini [webservers] web1 ansible_host= ansible_user= web2 ansible_host= ansible_user= [loadbalancer] lb ansible_host= ansible_user= 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** .. code-block:: html

Hallo DVA Praktikum

**Auszug aus dem Webserver-Docker Compose File:** .. code-block:: yaml services: apache: image: httpd:latest container_name: apache volumes: - "/opt/docker/html:/usr/local/apache2/htdocs" ports: - "80:80" **NGINX-Load-Balancer-Konfiguration:** .. code-block:: nginx http { upstream backend { server web1:80; server web2:80; } server { listen 80; location / { proxy_pass http://backend; } } } Verbindungstest ^^^^^^^^^^^^^^^^^^^^ Bevor man die Ansible Playbooks starten kann sollte man die Verbindung der Hosts aus der inventory.ini testen. Ausführung des Tests: .. code-block:: bash ansible -i inventory.ini all -m ping Ein erfolgreicher Test gibt z. B. zurück: .. code-block:: bash web1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3.10" }, "changed": false, "ping": "pong" } Die Ausgabe des Verbindungstests: .. image:: ./img/project5/test.png :alt: Verbindungstest Playbook ausführen ^^^^^^^^^^^^^^^^^^^ Um das Cluster auf verschiedenen Hosts bereitzustellen, wird das Ansible-Playbook wie folgt ausgeführt: .. code-block:: bash ansible-playbook -i inventory.ini deploy_docker_cluster.yml Nach der Ausführung ist die Seite über den Load Balancer unter ``http://`` erreichbar. Für die lokale benutzung ist Folgender Befehl der richtige: .. code-block:: bash ansible-playbook local_cluster.yml Die Seite ist dann unter ``http://localhost:8080`` erreichbar. Das deployment über Ansible sieht folgendermaßen aus: .. image:: ./img/project5/deployment.png :alt: Ansible Deployment Nun sollte auch in Docker das Cluster sichtbar sein und die Seite über den Loadbalancer erreichbar sein. .. image:: ./img/project5/docker_cluster.png :alt: Cluster Skript 2 - MacOS Installation ------------------------------ 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. 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: .. code-block:: bash ansible-playbook main.yml -i inventory 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: .. code-block:: yaml homebrew_installed_packages: - git - node - python - docker - jq - wget Auch grafische Anwendungen können über Homebrew Cask installiert werden: .. code-block:: yaml homebrew_cask_apps: - visual-studio-code - iterm2 - slack - firefox Mac App Store-Anwendungen ^^^^^^^^^^^^^^^^^^^^^^^^^^ Das Playbook unterstützt auch die Installation von Apps aus dem Mac App Store, indem deren IDs angegeben werden: .. code-block:: yaml mas_installed_apps: - { id: 497799835, name: "Xcode" } - { id: 409203825, name: "Numbers" } - { id: 409201541, name: "Pages" } 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: .. code-block:: yaml 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" 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: .. code-block:: yaml configure_terminal: true configure_sudoers: false configure_dotfiles: true 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. 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/)