Im vorherigen Teil haben wir uns damit beschäftigt, wie wir unser Heimnetzwerk (erst einmal nur die Raspberries) grundsätzlich einrichten.
Im nächsten Schritt möchte ich einen der Raspberries als Datenbankserver aufsetzen, indem ich dort MariaDB installiere. Die Performance des Raspies reicht dazu wunderbar aus und wir haben eine schöne, nette Testmaschine für die Entwicklung.
Wir starten also unsere Maschinen und wechseln in das vorher erstellte lokale Verzeichnis, wo die gesamte Ansible-Konfiguration ist.
MariaDB vom Scratch zu installieren, ist eine sehr, sehr mühsame Angelegenheit mit ganz vielen Problemen. Das alles hier zu beschreiben, würde den Rahmen des Blogs sprengen. Zum Glück gibt es aber passende Rollen, die wir benutzen können.
Eine Rolle in Ansible beschreibt alle Schritte, die für eine bestimmte Aufgabe benötigt werden und kann damit wunderbar von einzelnen Playbooks benutzt werden, ohne dass man das Rad neu erfinden muss. Die meines Erachtens beste Rolle für MariaDB ist die von Geerlingguy. Eigentlich zwar für MySQL, aber da (noch) MariaDB und MySQL praktisch gleich sind und MariaDB bei den meisten DIstributionen als Ersatz für MySQL Einzug gehalten hat, können wir die Rolle benutzen.
Zielhost
Wir wollen ja MariaDB nicht überall installieren, sondern auf einem dedizierten Server. Wir könnten daher direkt den Namen benutzen. Aber vielleicht kommt später noch ein weiterer Server dazu, wo MariaDB kommen sollte. Daher erstellen wir am besten in der Datei hosts eine neue Gruppe:
[mysqlserver]
rastaban-pi
Sie besteht im Moment ausschließlich aus dem von mir gewählten Pi rastaban-pi. Möchte ich später jedoch weitere Maschinen als MariaDB.-Server benutzen, muss ich nur sie hier eintragen und Ansible das Playbook neu ausführen lassen, fertig. Rastaban-pi wird nicht mehr verändert (Ansible installiert nicht neu, sondern prüft nur Abweichungen zwischen Soll und Ist. Gleichen sich beide, wird nichts gemacht) und der neue Server wird installiert.
MySQL Rolle
Ich benutze die ansible-role-mysql von Geerlingguy, daher clonen wir einfach sein Repository:
git clone https://github.com/geerlingguy/ansible-role-mysql.git
Nun gibt es einen kleinen Haken. Wenn wir unsere Sourcen in GitLab hinzufügen, würde dieses Repository ja auch drin landen, was wir nicht wollen. Daher fürs erste fügen wir dieses einfach ins gitignore. Geht auch eleganter, kommt aber später.
nano .gitignore
und fügen hinzu:
ansible-role-mysql
Geerlingguy beschreibt hervorragend in seinem Repository all die vielen Parameter, die man seiner Rolle übergeben kann. So kann sein Script auch gleich Tabellen und User anlegen. Kann man machen, ich bin da aber eher nicht der Freund von. M.E. sollen immer die einzelnen Projekte sich für ihre Datenbankverwaltung kümmern. Bin ich gerade an einem JavaSpring Projekt dran, dann erstelle ich mir von dort die benötigte Datenbank. Aber in manchen Fällen kann es natürlich sinnvoll sein.
Wie von Geerlingguy vorgeschlagen, speichern wir die Variablen in einer separaten Datei. Aber wir legen noch eine weitere für das MariaDB-Root-Passwort, damit es nicht versehentlich in Git landet. Übrigens, es wurden schon sehr, sehr viele Server nur deswegen gehackt, weil jemand seine Passwörter mit ins Git upgeloadet hatte…
Aber nun zum Playbook. Wir erstellen eine Datei playbook_mysql.yml und füllen diese mit folgenden Inhalt:
- hosts: mysqlserver
become: yes
vars_files:
- vars/mysql.yml
- vars/mysql-password.yml
roles:
- { role: geerlingguy.mysql }
Dann erstellen wir das Verzeichnis vars und die beiden Dateien mysql,yml sowie mysql-password.yml:
mkdir vars
touch vars/mysql.yml
touch varS/mysql-password.yml
Zuerst editieren wir die mysql.yml. Ich schreibe mir persönlich gern Kommentare und Verweise, falls noch eine weitere Datei benötigt wird, die ich nicht einchecke, sonst weiß ich evtl. nach Jahren nicht mehr, warum das blöde Skript denn nun wieder nicht funktioniert:
# Das MySQL Password wird in einer separaten Datei gespeichert
# mysql-password.yml
# und via gitignore vom Upload ins Repository ausgeschlossen
#mysql_root_password: sehe oben
mysql_enabled_on_startup: true
mysql_packages:
- mariadb-client
- mariadb-server
- python-mysqldb
Im Gegensatz zum Beispiel von Geerlingguy müssen wir die drei Packages mariadb-client, mariadb-server und python-mysqldb separat aufnehmen, da so die Dateien bei RaspiOS heißen.
Die Datei mysql-password.yml beinhaltet dann nur das Passwort:
mysql_root_password: hierkommtdaspassword
Damit diese nicht via commit ins Git kommt, wird sie mit gitignore ausgeschlossen:
echo 'vars/mysql-password.yml' >> .gitignore
Nun können wir das Playbook ausführen mit
ansible-playbook playbook_mysql.yml
Dauert eine ganze Weile und am Ende ist unser Datenbankserver fertig.