marcusianlevine.django-container
ansible-django-container
Fügt einen von Gunicorn betriebenen Django-Dienst zu deinem Ansible Container Projekt hinzu. Führe die folgenden Befehle aus, um den Dienst zu installieren:
# Setze das Arbeitsverzeichnis auf das Stammverzeichnis deines Ansible Container Projekts
$ cd meinprojekt
# Installiere den Dienst
$ ansible-container install marcusianlevine.ansible-django-container
Anforderungen
Ein vorhandenes Ansible Container Projekt. Um ein Projekt zu erstellen, führe einfach die folgenden Befehle aus:
# Erstelle ein leeres Projektverzeichnis $ mkdir meinprojekt # Setze das Arbeitsverzeichnis auf das neue Verzeichnis $ cd meinprojekt # Initialisiere das Projekt $ ansible-container init
Standardmäßig erstellt diese Rolle einen Benutzer innerhalb des Containers mit dem Namen "django". Während der Bereitstellung sollte der Container-Einstiegspunkt-Prozess als dieser Benutzer ausgeführt werden.
Die Datei requirements.txt deines Django-Projekts muss gunicorn enthalten.
Zusätzlich zum Ausführen von collectstatic und dem Einbetten deiner statischen Dateien im resultierenden Docker-Image unterstützt diese Rolle auch das Übertragen deiner statischen Dateien z. B. an einen nginx-Container über Docker-Volumes.
- Dieses Verhalten wird erreicht, indem die statischen Dateien zum Conducteur kopiert werden, damit sie dann in jeden anderen Container, der durch dasselbe Ansible-Container-Pipeline gebaut wird, kopiert werden können.
Rollenvariablen
Hinweis: Um den Unterschied zwischen Ansible- und Umgebungsvariablen klar zu halten, werden Variablen im Ansible-Kontext kleingeschrieben (dies_ist_ansible), während Umgebungsvariablen immer in Großbuchstaben geschrieben werden (UMGEBUNGS_VARIABLE).
Ansible Rollenvariablen
Diese Variablen können entweder in container.yml während der Rolleneinbeziehung oder durch Angabe deiner Variablen in einer Datei überschrieben werden, die in container.yml unter der var_files
Rollenvariable als Pfade relativ zu /src
(der Pfad auf dem Ansible-Container Conducteur, wo der Quellcode deines Projekts gemountet ist) enthalten ist.
project_name
: Name deines Django-Projektordners und der Projekt-App (geht von einer Standard-Django-Ordnerstruktur aus)django_environment
: Dictionary von Umgebungsvariablen-Definitionen, die in das postactivate-Skript von virtualenv injiziert werden (siehe defaults/main.yml für ein Beispiel)requirements_file
: Wenn sich die Anforderungen-Datei deiner Django-App nicht im Wurzelverzeichnis deines Repos befindet, kann diese verwendet werden, um den relativen Dateipfad anzugeben.core_source_files
: Standardmäßig werdenrequirements_file
und das oberste Verzeichnis in deinem Repo, dessen Name mitproject_name
übereinstimmt, in den Container eingebaut. Zusätzliche Quelldateien, die ins Image eingebaut werden müssen, können hier angegeben werden.django_static_root
: Gibt das Verzeichnis an, in dem Django statische Dateien sammeln wird. Dies sollte mit dem Wert vonSTATIC_ROOT
in deinen Django-Einstellungen übereinstimmen oder von einer Umgebungsvariable geladen werden, die indjango_environment
angegeben ist.django_media_root
: gleiche Funktion wiedjango_static_root
, aber für dieMEDIA_ROOT
Django-Einstellung.manage_path
: Ort des manage.py-Skripts des Projekts, standardmäßig das oberste Verzeichnis, das mitproject_name
übereinstimmt.django_rpm_deps
unddjango_apt_deps
: Liste von Paketnamen für entweder apt oder yum, abhängig von deiner Zielverteilung (beachte, dass dasselbe Paket in dem anderen Paket-Repository einen etwas anderen Namen haben könnte).script_templates
: Gib eine Liste von Pfaden relativ zu /src (dem Pfad auf dem Ansible-Container Conducteur, wo dein Projekt gemountet ist) für zusätzliche Jinja2 (oder reine Text-) Skriptdateien an, die du ins Image unter /usr/bin/ einfügen möchtest.- Hinweis: Die endgültige Erweiterung jeder Dateiname wird abgeschnitten, sodass
scripts/gunicorn_start.j2
ins Image als/usr/bin/gunicorn_start
transformiert wird.
- Hinweis: Die endgültige Erweiterung jeder Dateiname wird abgeschnitten, sodass
bundle_build_cmd
: Wenn du ein webpack oder ähnliches Bundle erstellen musst, gib hier den auszuführenden Befehl an.- Hinweis: Alle Systemabhängigkeiten, die für die Ausführung dieses Build-Befehls erforderlich sind, müssen vor dieser Rolle installiert werden.
bundle_build_dir
: Verzeichnis, von dem ausbundle_build_cmd
ausgeführt werden soll, standardmäßigmanage_path
.virtualenv_python_version
: Python-Binärdatei mit Version, standardmäßigpython2.7
.pip_command
: Befehl zur Ausführung von pip, standardmäßigpip
, ein weiteres Beispiel istpip3
.pip_path
: absoluter Pfad zur pip-Binärdatei, standardmäßig/usr/bin/{{ pip_command }}
.
Umgebungsvariablen
Die folgenden Umgebungsvariablen müssen von deinem container.yml Django-Dienst definiert werden, um diese Rolle bereitzustellen.
DJANGO_PORT
: Portnummer, unter der die Django-App bereitgestellt werden soll.DJANGO_VENV
: absoluter Pfad zum Speicherort, an dem die Python-Virtualenv der Django-App leben wird (Standard: /venv).DJANGO_USER
: Name des Benutzers, der alle Anwendungsdateien besitzt und den Anwendungsprozess ausführt (Standard: django).
Angemessene Standardwerte werden als kleingeschriebene Ansible Rollenvariablen für all diese Werte bereitgestellt, die in deinem container.yml environment
-Tag mit Anführungszeichen und YAML-Klammern injiziert werden können (z. B. DJANGO_VENV: '{{ django_venv }}').
Einfügen von Vault-Geheimnissen
Derzeit unterstützt Ansible-Container keine Vault-verschlüsselten Dateien und Variablen direkt in container.yml, aber du kannst Geheimnisse in deine Images einbetten, indem du Ansible-Playbook von dem Conducteur aus ausführst.
In dieser Rolle ist die django_environment-Variable ein Dictionary von Umgebungsvariablen, die in einem postactivate-Skript platziert werden, das vor jedem Aufruf von django manage.py ausgeführt werden muss.
WICHTIG: Das bedeutet, dass alle Geheimnisse, die im Ziel-Image gespeichert sind, im Image selbst sichtbar sind (es sei denn, sie werden während der Bereitstellung flach gemacht) sowie bei der Prüfung einer laufenden Instanz deines Images.
Dies ist die derzeit beste Lösung zum programmgesteuerten Einbetten von Geheimnissen mit Ansible-Container; solange du deine gebauten Images nicht in ein öffentliches Container-Register veröffentlichst, sollte dies kein großes Anliegen sein.
Lizenz
BSD
Autoreninformation
Adaptierte von dem offiziellen Ansible-Container Django Beispielsprojekt
Geschrieben von Marcus Levine für CKM Advisors.
Container-enabled role for configuring a Django app behind Gunicorn
ansible-galaxy install marcusianlevine.django-container