Ansible
Schritt für Schritt zum Webhosting
Indiesem Dokument wird die Funktionsweise von Ansible und praktische Beispiele zur Verwendung und Aufbau am Beispiel Webhosting erklärt. Eine Webhosting Umgebung mit folgenden typischen Komponenten:
- Mailserver
- Webserver
- Datenbank
Einleitung
Mit der Einleitung kommen wir schon an den Punkt von Komplexität: Statt mit den Basics von Ansible, fangen wir mit der grundlegenden Planung der Projektes Webhosting Infrastruktur, an.
Zum Verständnis:, die Systeme sind per vlan miteinander Verbunden und nur einzelne Dienste extern erreichbar. Somit laufen Mailserver, Webserver und Datenbankserver auf getrennten Systemen. Über Firewall Regeln ist die Kommunikation bereits auf das nötigste eingeschränkt und klar geregelt. Dies dient schlicht zur Absicherung der Umgebung, ist jedoch kein Bestandteil dieser Dokumenten Reihe!
Wir haben einen redundanten Betrieb, also jeder Stack (Mailserver, Webserver und Daenbanksysteme) hat jeweils 2 Knoten. Probleme und Ausfälle sollen so kurz wie möglich bleiben, wenn nicht sogar vollautomatisch vermieden werden. Auch die ist nicht Bestandteil der Dokumentation, für den Aufbau der Systeme per Ansible. Cluster Setups sprengen den Rahmen. Aber am Ende seid ihr selbst in der Lage eure Playbooks entsprechend zu ergänzen.
So sieht die geplante Umgebung aus:
In unserem Beispiel sieht also das Setup wie folgt aus:
2 Mailserver
- Failover IP für den Schwenk auf das Ersatzsystem
- mail01
- Mailserver für den Produktiven Betrieb
- mail02
- Mailserver als Ersatzsystem. Könnte auch zur Lastverteilung genutzt werden.
- mx Domain Alias mit Auflösung zur Failover IP zum Schwenken auf den aktiven Knoten. Primär eingehender Email Verkehr.
2 Webserver
- Failover IP für den Schwenk auf das Ersaztzsystem.
- web01
- aktiver Webknoten
- web02
- passiver Failover Knoten
- web Domain Alias und Failover IP zum schwenken auf den aktiven Knoten.
2 Datenbankserver
- db01
- Aktiver Master Knoten
- db02
- Replikations Slave als Failover System und bei Lastverteilung als Lese Knoten
Aus der Anforderung oben: Mailserver, Webserver und Datenbankserver ergeben sich schnell eine Vielzahl an Anwendungsfälle und Optionen wie:
Mailserver
Welcher Mailserver soll zum Einsatz kommen? Zimbra, Openexchange uvm. oder ein einfacher SMTP, POP3 Daemon?
Wo und wie werden die Benutzer und Zugänge geregelt? Gibt es einen Webmail / Administrationsoberfläche?
Werden Komponenten wie Spam und Virenfilter eingebunden?
Webserver und Webapplikation:
Neben Apache als Webserver stehen auch Alternativen wie nginx, lighttpd usw. zur Auswahl. PHP, Perl usw. wird meist benötigt. Als Frage: Welche Betriebsart (mod_php, fpm etc.) solle für welche Webapplikation genutzt werden?
Kommen für einelne Webapplikationen spezielle Anforderung wie z.B. Redis Cache zum Einsatz?
Datenbank
Welche Webapplikation verwendet welche Datenbank oder welche Datenbank möchte der Kunde nutzen? Mit welcher Version ist die Webanwendung kompatibel?
Fazit
Behalten wir das mal im Hinterkopf, was sein könnte.
Wie ihr seht, kann ein solcher Aufbau schnell komplex und unübersichtlch werden. Aber keine Sorge, wir erarbeiten in dieser Dokumentenreihe eine einfach Umgebung mit folgender Anforderung:
Linux Betriebsystem
- Ubuntu
- SLES / OpenSUSE
Webserver
- Apache
- mit PHP8.1 als FPM
Datenbank
- MySQL
Mailserver
- Postfix (SMTP)
- Dovecot (POP3 IMAP)
Und dann war da noch Verschlüsselung…..
Planung
Fangen wir also damit an die Grundlegende Schritte zu planen.
Kompliziert wird es früh genug. Daher ist eine gute Vorplanung immens wichtig um den Überblick nicht zu verlieren und am Ende wartbare Ansible Playbooks zu erhalten.
Welche Aufgaben sind zu erledigen?
- Bestellung der Server
- Registrierung der Domains
Diese beiden Schritte setzen wir vorasus inkl. einem FQDN und Kurznamen für die Systeme:
Die Arbeitsschritte:
- Vorbereitung Linux Betriebsystem
- Installation von Binaries z.B. Python für Ansible.
- SSH Key ausrollen
- Aufteilung der System anch Aufgaben
- Mailserver
- Datenbankserver
- Webserver
- Installation Basissystem
- Update und Upgrade
- Installation allgemein erforderliche Anwendungen zur Administration.
- Monitoring
- Systemtools „wget, curl, joe,…“
- MySQL Client
- Abhängikeiten für Ansible
- Webserver Konfiguration
- Grundinstallation
- PHP8.1
- Apache2
- Benutzer und Webspace Anlage
- Anlage Webkonfiguration
- Apache vhosts
- php-fpm
- pool
- php.ini
- Anlage Webspace und Benutzer
- Benutzer
- Mointpoints für die einzelnen Websspaces
- Berechtigungen einrichten.
- Zugang per SFTP
- Anlage Webapplikation Grundinstallation
- Dieser Punkt ist noch nicht bestandteil des Dokuments.
- Grundinstallation
- Datenbankanlage
- Datenbank für die Webanwendung
- Benutzer und Passwort für den Zugangs zur Datenbank.
Auch wenn die Reihenfolge und Zusammenhänge später noch organisiert werden müssen, so hilft es schon mal die einzelnen Schritte zusammen zu fassen und in adminitrative Einzelschritte zu Gruppieren. Daraus wiederum erstellen wir Rollen.
Was sind Ansible Rollen und wie werden diese genutzt?
Ganz knapp und theoretisch erklärt: Rollen sind als Namensräume zu verstehen, unter welcher Aufgaben und Zusammenhänge organisiert werden können.
Das heisst: Ich kann mehre Rechner im Namensraum basissystem zusammen fassen. In den gleichen Namensraum kann man Benutzer und andere Komponenten wie Domains zusammen fassen. Die Details ergeben sich später aus dem Dokument.
Damit wiederum lassen sich Scripte und Aufgaben in einer Gruppe zusammen fassen, die genau das machen, was für eine Rolle: basissystem, also der Bereitstellung eines standardisierten Linux Systems erledig werden soll. Wie schnell hat man auf einem Host eine Tool vergessen. Scripte z.B. Backup funktionieren nicht, weil die Software nicht existiert. Mit der Rolle basissystem fassen wir also alles zusammen, was wir allgemein benötigen.
Physisch betrachtet sind also Rollen Unterordner innerhalb eures Ansible Stammverzeichnisse ANSIBLE_HOME. Dazu kommen wir ebenfalls später! Wir gehen es ja Schritt für Schritt an.
+- roles
+--+basissystem
+--+--+defaults # Defaultkonfigurationen und Variablen
+--+--+handler
+--+--+meta # Meta Informationen Projektbeschreibung
+--+--+tasks # Hier finden sich die wirklichen Arbeitschritte
+--+--+templates # Vorlagen i.d.R. Konfigurationen
+--+--+tests # Sofern Tests notwendig sind.
+--+--+vars # Variablen in form von Listen wie Benutzernamen und zugehörige Attribute
So sieht eine Struktur einer „Rolle“ aus. Die gleiche Struktur der Rolle wird i.d.R. auch auf Hauptebene des Playbooks angelegt.
Die oberste Struktur sieht dann wie folgt aus:
Nachfolgend „ANSIBLE_HOME“ in der Dokumentation genannt. Der Unterordner für Rollen lautet demnach: „ROLES_HOME“
+-defaults # Defaultkonfigurationen und Variablen
+-handler
+-meta # Meta Informationen Projektbeschreibung
+-tasks # Hier finden sich die wirklichen Arbeitschritte
+-templates # Vorlagen i.d.R. Konfigurationen
+-roles #Unterordner mit den jeweiligen Rollen.
+-tests # Sofern Tests notwendig sind.
+-vars # Variablen in form von Listen wie Benutzernamen und zugehörige Attribute
Zurück also zur Frage: Welche Aufgaben haben wir und wie organisieren wir es?
Rolle: Basisystem
In der Rolle legen wir folgende Aufgaben „tasks“ ab. Hierfür erstellen wir später einzelne yaml Dateien mit den notwendigen Anweisungen.
- Aktualisierung des Betriebsystemes
- Diesen Schritt können wir übrigens perfekt für zukünftige Aktaulisierungen weiter verwenden!
- Taks:
- Update des Repository z.B. apt update
- Installation der Aktualisierungen
- Prüfen ob ein Server Neustart erforderlich ist.
- Je nach Abhängikeit Neustart des Servers.
- Installation der Software
- Anlage Systembenutzer für einheitliche Vergbe von UID und GUI.
- Netzwrkonfiguration
- Einrichten von vlans
- Clusterip
- etc.
Mit diesen Aufgaben ist das System betriebsbereit.
Wir legen hier schon übliche Systembenutzer für die Dienste an und geben UID und GID vor. Dies hat den Vorteil, dass später eine Wiederherstellung aus dem Backup keine Probleme mit unterschiedlichen Benutzerrechten ergibt. Konkret: Fällt der Mailserver 1 aus, kann ich aus dem Backup des Mailserver 1 die Postfächer auf em Mailserver 2 wieder herstellen, ohne hinterher prüfen zu müssen, ob die Benutzerrechte noch passen.
Berücksichtigen wir also wwwrun und Gruppe www oder Benutzer und Gruppe www-data. Abhängig von euerer Diestirbution. Das gleiche für den Datenbankbetrieb mysql.
Rolle Datenbankserver:
Für das Aufsetzen des Datenbankservers sind folgende Schritte notwendig und ist für uns die 1. Baustelle. Ich gebe es offen zu, ich habe den Datenbankserver erstmals manuell installiert.
Dennoch:
- Installation der Binaries mariadb-server oder mysql-server
- Für beide Datenbanken
- Kopieren einer Vorlage „template“
- Listener Port und IPAdresse einstellen.
- Tunng Parameter einstellen
- Kopieren einer Vorlage „template“
- Anpassung Konfiguration des Datenbankservers „Replik“ (Master)
- Aktivieren Binärlog
- Einstellen der ServerID
- Anlegen Replikationsbenutzer und notwendigen Rechten.
- Erstellen eines Datenbankdumps mit BINLOG DATA
- Anpassung Konfiguration des Datenbankserver Replikat (Slave).
- Einstellen der ServerID
- Einspielen der Sicherung der Replik (Master) Datenbank.
- Starten des Replikation
- prüfen ob die Replikation läuft.
Rolle: Webserver
Hier installieren wir die für den Webserver erforderliche Software, legen die Webbenutzer, Webkonfigurationen, Datenbankzugänge etc. an.
Ich füge in () den Task Dateinamen hinzu, den wir später ggf. nutzen.
- Installation Software (install-app.yml)
- apache2
- apache2-module
- php8.1
- php8.1-*Erweiterungen
- redis-Cache
- Einrichten Benutzer: (create-user.yml)
- Anlegen eines LVM Volumes
- Formatieren des Filesystems
- Anlegen des Moinpoints (Verzeichnis wo später das Filesystem gemountet werden soll)
- Mounten des Filesystemes
- Eintrag in die /etc/fstab
- Anlegen des Benutzers mit definition der UID, GUID sowie Benutzer und Gruppenme
- Homeverzeichnis ist der neue Mounpoint.
- Mit der festen Vergabe eines LVM Volumes sparen wir uns viel Ärger und Arbeit und den Umgang mit Quotas.
- Erzeugung SSL Keys
- Erzeugung SSH Konfiguration mit chroot, so dass der Benutzer sich anmelden kann.
- Einrichten Domain und Webspace
- Anlegen des WebRoot Verzeichnis im Homedir des Benutzers.
- Sofern euer Setup vorsieht, dass ein Benutzer mehrere Domains betreibt, macht eine Trennung nach Domain als Unterordner Sinn. Für das Webroot jedenfalls ein eigener Unterordner einrichten!
- Anlegen PHP Konfigration (php-fpm)
- Individualisierung nach Webanwendung aus Templates
- Anlegen Vhost Konfiguration (apache2)
- Individualisierung nach Webanwendung aus Templates
- Anlegen Ordner für PHP: Sockets, sessions, upload und temp.
- Verzeichnisrechte anpassen.
- Abschlussarbeiten
- SSL Zertifikat mit letsencrypt erstellen
- Achtung Stolperstein: Je nachdem wie Letencrypt eingebunden wird, als Standalone oder Webdir, muss der Apache vorher neu gstartet werden. Ich persönlich erstelle die HTTP und HTTPS Konfiguration vorab. Damit kann ich den Webserver erst nach dem Erstellen der SSL Zertifikate starten. Bedeutet, für eine Aktualisierung der Zertifikate und initiale Erstellung ist eine Downtime erforderlich!
- apache2 reload
- SSL Zertifikat mit letsencrypt erstellen
- Anlage Datenbank Benutzer
- Anlage .my.cnf im Benutzer Home Verzeichnis. mit den Zugangsdaaten zur Datenbank.
- !Aus Sicherheitsgründen macht man es eher nicht. Allerdings steht das Passwort auch im Klartext in der Konfiguration der Webapplikation.
- Alternativ, Bereitstellung der Webanwendung.
- Anlegen des WebRoot Verzeichnis im Homedir des Benutzers.
Rolle Mailserver:
Für das Aufsetz des Mailservers sind folgende Schritte notwendig. Ich habe den Schritt nach dem Webserver geplant, da auf dem Webserver die Verwaltungsoftware für Maillaccounts sowie Webmail Client eingerichtet wird.
- Installation der Mailserver Binaries
- postfix
- dovercot
- amavisd
- clamd
- .. etc
- Konfiguration der Dienste
- Kopieren von Vorlagen oder anpassen der Konfigurationen aus der Installation.
- Datenbankverbidnung einrichten
- usw.
- Starten des Mailserver
- postfix
- dovecot
- amavisd
- clamd
- …
- ggf. Test ob E-Mails versendet und empfangen werden.
Somit ist klar, der meiste Aufwand liegt beim Webserver. Damit ist die Installation abgeschlossen und das System Betriebsbereit.
Fazit
Jetzt ist klar, wie komplex doch eine vermeintlich einfache Webserver installtion sein kann. Btw. natürlich kann man das auch alles auf einem Server installieren. Die Trennung soll spätere Anpassungen und Trennung der Aufgaben schon jetzt erleichtern. Und wir brauchen ja ein Beispiel, welches Möglichkeiten in den Rollen steckt.
Zudem machen kleinere Einzelschritte Anpassungen und Ergänzungen leichter und weniger fehleranfällig.