yourlabs.compose
Bereitstellung einer docker-compose.yml auf einem Server
Ansible-Rolle zum Bereitstellen einer docker-compose.yml in einem Benutzerverzeichnis, am besten verwendet mit bigsudo.
Diese README beschreibt die Funktionen. Weitere Informationen finden Sie im TUTORIAL.md, das ein Tutorial mit bewährten Methoden für eXtreme DevOps bietet.
Beispiel
Diese Rolle testet sich selbst, und Sie können direkt kopieren:
- Dockerfile: funktioniert standardmäßig für ein CRUDLFA+-Projekt, bietet komprimierten und zwischengespeicherten Dienst für statische Dateien und einen Spooler.
- .gitlab-ci.yml: erstellt und veröffentlicht ein Docker-Image im GitLab-Image-Registry, bietet eine YAML-Vorlage für Bereitstellungsjobs (Makro) sowie 3 Beispiel-Bereitstellungskonfigurationen für verschiedene Einsatzmöglichkeiten.
- docker-compose.yml: für lokale und temporäre Bereitstellungen.
- docker-compose.traefik.yml: für Unterstützung von yourlabs.traefik.
- docker-compose.persist.yml: Add-on für persistente Bereitstellungen, z.B. in .gitlab-ci.yml angegeben, benötigt docker-compose.traefik.yml.
Sie müssen Folgendes ändern:
- .gitlab-ci.yml: Es gibt einige
# UNCOMMENT ABOVE AND REMOVE BELOW
Kommentare, befolgen Sie die Anweisungen, damit Sie yourlabs/ansible verwenden. - ci.yourlabs.io mit Ihrem Server in .gitlab-ci.yml.
- GitLab CI-Variable setzen:
$CI_SSH_KEY
, dies sollte einen ed25519 privaten Schlüssel enthalten, den Sie mit folgendem Befehl erstellen können:ssh-keygen -t ed25519 -a 100
. - Dockerfile: Ändern Sie das Befehlsargument
--module=wsgi:application
mit dem entsprechenden Pfad zu Ihrer WSGI-Anwendung, entfernen Sie die bigsudo-Einrichtung, wenn Sie möchten, und kommentieren Sie nach Belieben aus.
Dann können Sie alles nach Belieben anpassen!
Weitere bigsudo-Befehle, die Sie verwenden können:
- Aktivieren Sie einen Backup-Systemd-Timer mit:
bigsudo yourlabs.compose backup home=/home/$CI_PROJECT_NAME-$CI_ENVIRONMENT_NAME
. - Auf dem CI-Server für Bereitstellungsüberprüfungen, um nicht verwendete Images, Volumen und Netzwerke zu entfernen:
bigsudo yourlabs.docker prunecron @ci.your.host
. Dies verhindert, dass die Überprüfungsbereitstellungen den Speicherplatz füllen.
Sie können auch eine allgemeinere und konzeptionelle Beschreibung im Blogartikel über eXtreme DevOps erhalten.
Dokumentation von Funktionen
Ziel dieser Rolle ist es, die Bereitstellung einer Zusammenführung von docker-compose.yml-Dateien in ein Verzeichnis auf einem Host zu automatisieren und die damit verbundenen Aufgaben zu automatisieren.
Von einem Verzeichnis mit einer docker-compose.yml-Datei aus können Sie es in $host:/home/staging
mit folgendem Befehl bereitstellen:
bigsudo yourlabs.compose home=/home/staging $user@$host
Wenn $user@$host
nicht definiert ist, wird es auf localhost ausgeführt.
Sie können mehrere Compose-Dateien übergeben, und Umgebungsvariablen werden beim Generieren der endgültigen Datei weitergeleitet:
FOO=bar bigsudo yourlabs.compose \
home=/home/staging \
compose_django_image=$YOUR_IMAGE \
compose=docker-compose.yml,docker-compose.staging.yml
Verzeichnisgenerierung
Diese Rolle kann auch Verzeichnisse mit einer bestimmten uid, gid und Berechtigung vorab erstellen, mit dem Label io.yourlabs.compose.mkdir
wie folgt:
volumes:
- "./log/admin:/app/log"
labels:
- "io.yourlabs.compose.mkdir=./app/log:1000:1000:0750"
Dies führt zur Erstellung des Verzeichnisses {{ home }}/log/admin
mit dem Eigentümer 1000, der Gruppe 1000 und der Berechtigung 0750.
Umgebungsbereitstellung
Eine weitere interessante Funktion ist die automatische Umgebungsbereitstellung mit jeder Variable, die in der Dienstumgebung deklariert und zur Laufzeit definiert ist. Zum Beispiel mit diesem Inhalt in docker-compose.yml:
environment:
- FOO
Wenn Sie dann die yourlabs.compose-Rolle mit der FOO-Variablen so ausführen:
FOO=bar bigsudo yourlabs.compose home=/home/test
Ergibt sich die folgende Umgebung:
environment:
- FOO=bar
YAML-Überschreibungen über die CLI
Sie können auch Dienstwerte mit der Variable compose_servicename_keyname
hinzufügen oder überschreiben. Beispiel für das Überschreiben des Wertes compose[services][django][image]
zur Laufzeit:
bigsudo yourlabs.compose home=/home/test compose_django_image=yourimage
Sie können Werte zur Laufzeit leeren, indem Sie einfach leere Werte übergeben. Um beispielsweise compose[services][django][build]
leer zu machen, geben Sie compose_django_build=
ohne Wert an. Wenn Sie Ihr Repo nicht im Home-Verzeichnis klonen, würde Docker-Compose eine Fehlermeldung ausgeben, wenn der Pfad zur Dockerfile nicht gefunden wird; dies umgeht diese Einschränkung:
bigsudo yourlabs.compose home=/home/test compose_django_build=
Netzwerkautomatisierung
Netzwerke können auch etwas kompliziert zu verwalten sein mit Docker-Compose. Beispielsweise haben wir typischerweise ein web
Netzwerk mit einem Load Balancer wie Traefik. Dies fügt das web
Netzwerk dem Django-Dienst hinzu und wird automatisch verknüpft, wenn das Netzwerk vorhanden ist, indem das Netzwerk web
in der docker-compose.yml-Datei als extern deklariert wird:
bigsudo yourlabs.compose home=/home/test compose_django_networks=web
Wenn Sie die docker-compose.yml Ihres Load Balancers erstellen, haben Sie das gegenteilige Problem: die docker-compose.yml deklariert ein web
Netzwerk als extern. Docker-Compose up wird es jedoch nicht erstellen und würde daher mit folgendem Fehler scheitern:
ERROR: Network web declared as external, but could not be found. Please create the network manually using `docker network create lol` and try again.
Diese Rolle verhindert dieses Problem, indem sie die docker-compose.yml nach externen Netzwerken durchsucht und das Ansible-Modul docker_network
verwendet, um es bei Bedarf auf dem Host vorab zu erstellen.
Als Ansible-Rolle
Abschließend können Sie diese Rolle wie jede andere Ansible-Rolle verwenden, wenn Sie sie in weitere Aufgaben in Ihrem Repo einfügen möchten:
- name: Sicherstellen, dass Docker einmal auf diesem Host eingerichtet wurde
include_role: name=yourlabs.compose
vars:
home: /home/yourthing
compose_django_image: foobar
compose_django_build:
compose_django_networks:
- web
Backups
Automatisierte Backups sind für Bereitstellungen mit einem home
Argument aktiviert. Es werden 3 Skripte in /home eingerichtet:
- ./backup.sh: erstellt ein lokales Backup und ein Backup in Restic.
- ./restore.sh: listet Restic-Snapshots auf, führen Sie es mit einem Restic-Snapshot-Hash als Argument aus, um den Snapshot wiederherzustellen.
- ./prune.sh: entfernt alte Backups.
Es werden 1 Systemd-Dienst und 1 Systemd-Timer erstellt:
- backup-PROJECTNAME.service
- backup-PROJECTNAME.timer
Hacking
Um diese Rolle auf localhost zu entwickeln:
# Docker-Image erstellen
docker build -t test .
# bigsudo so ausführen:
bigsudo . home=/tmp/test compose_django_build= compose_django_image=test compose=docker-compose.yml,docker-compose.persist.yml
Beachten Sie, dass es immer versucht, das Backup-Skript vor der Aktualisierung auszuführen. Wenn Sie es ändern, müssen Sie backup.sh vor der erneuten Ausführung von yourlabs.compose löschen, damit es backup.sh aktualisiert.
ansible-galaxy install yourlabs.compose