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

  • Ansible Container

  • 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 werden requirements_file und das oberste Verzeichnis in deinem Repo, dessen Name mit project_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 von STATIC_ROOT in deinen Django-Einstellungen übereinstimmen oder von einer Umgebungsvariable geladen werden, die in django_environment angegeben ist.

  • django_media_root: gleiche Funktion wie django_static_root, aber für die MEDIA_ROOT Django-Einstellung.

  • manage_path: Ort des manage.py-Skripts des Projekts, standardmäßig das oberste Verzeichnis, das mit project_name übereinstimmt.

  • django_rpm_deps und django_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.
  • 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 aus bundle_build_cmd ausgeführt werden soll, standardmäßig manage_path.

  • virtualenv_python_version: Python-Binärdatei mit Version, standardmäßig python2.7.

  • pip_command: Befehl zur Ausführung von pip, standardmäßig pip, ein weiteres Beispiel ist pip3.

  • 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.

Über das Projekt

Container-enabled role for configuring a Django app behind Gunicorn

Installieren
ansible-galaxy install marcusianlevine.django-container
GitHub Repository
Lizenz
bsd-3-clause
Downloads
657
Besitzer
Data Science + DevOps = DataEng