marcusianlevine.django-container
ansible-django-container
Agrega un servicio Django impulsado por Gunicorn a tu proyecto de Ansible Container. Ejecuta los siguientes comandos para instalar el servicio:
# Establece el directorio de trabajo en la raíz de tu proyecto Ansible Container
$ cd myproject
# Instala el servicio
$ ansible-container install marcusianlevine.ansible-django-container
Requisitos
Un proyecto Ansible Container existente. Para crear un proyecto, simplemente ejecuta lo siguiente:
# Crea un directorio de proyecto vacío $ mkdir myproject # Establece el directorio de trabajo en el nuevo directorio $ cd myproject # Inicializa el proyecto $ ansible-container init
Por defecto, este rol crea un usuario dentro del contenedor llamado "django". Durante la implementación, el proceso de entrada del contenedor debe ejecutarse como este usuario.
El archivo requirements.txt de tu proyecto Django debe contener gunicorn.
Además de ejecutar collectstatic e incrustar tus archivos estáticos en la imagen Docker resultante, este rol también admite transferir tus archivos estáticos a, por ejemplo, un contenedor nginx a través de volúmenes de Docker.
- Este comportamiento se logra copiando los archivos estáticos al conductor, para que luego puedan ser copiados a cualquier otro contenedor construido por el mismo pipeline de ansible-container.
Variables del Rol
Nota: para ayudar a mantener clara la diferencia entre las variables de Ansible y las variables de entorno, las variables en el contexto de Ansible estarán en minúsculas (this_is_ansible), mientras que las variables de entorno siempre estarán capitalizadas (ENVIRONMENT_VARIABLE).
Variables del Rol de Ansible
Estas variables se pueden sobrescribir ya sea en container.yml durante la inclusión del rol, o especificando tus variables en un archivo y incluyéndolas en container.yml bajo la variable de rol var_files
como rutas relativas a /src
(la ruta en el conductor de ansible-container donde está montado el código fuente de tu proyecto).
project_name
: nombre de la carpeta de tu proyecto Django y de la aplicación del proyecto (asume la estructura de carpeta estándar de Django).django_environment
: diccionario de definiciones de variables de entorno que serán inyectadas en el script postactivate de virtualenv (consulta defaults/main.yml para un ejemplo).requirements_file
: si el archivo de requisitos de tu aplicación Django no se encuentra en la raíz de tu repositorio, se puede usar para especificar la ruta relativa.core_source_files
: por defecto,requirements_file
y el directorio de nivel superior en tu repositorio cuyo nombre coincide conproject_name
serán incluidos en el contenedor. Archivos fuente adicionales que necesitan ser incluidos en la imagen pueden especificarse aquí.django_static_root
: especifica el directorio donde Django recogerá archivos estáticos. Este debe coincidir con el valor deSTATIC_ROOT
en tus ajustes de Django, o ser cargado conos.environ
desde una variable de entorno postactivate especificada endjango_environment
.django_media_root
: misma función quedjango_static_root
, pero para la configuraciónMEDIA_ROOT
de Django.manage_path
: ubicación del script manage.py del proyecto, por defecto se establece en el directorio de nivel superior que coincide conproject_name
.django_rpm_deps
ydjango_apt_deps
: lista de nombres de paquetes para apt o yum, dependiendo de tu distribución objetivo (ten en cuenta que el mismo paquete podría tener un nombre ligeramente diferente en el otro repositorio).script_templates
: proporciona una lista de rutas relativas a /src (la ruta en el conductor de ansible-container donde está montado tu proyecto) para archivos de script adicionales de Jinja2 (o texto plano) que te gustaría incluir en tu imagen en /usr/bin/.- Nota: La extensión final de cada nombre de archivo será truncada, por lo que
scripts/gunicorn_start.j2
se incluiría en la imagen como/usr/bin/gunicorn_start
.
- Nota: La extensión final de cada nombre de archivo será truncada, por lo que
bundle_build_cmd
: si necesitas construir un paquete de webpack o similar, proporciona el comando para ejecutarlo aquí.- Nota: cualquier dependencia del sistema necesaria para que este comando de construcción funcione debe estar instalada antes de este rol.
bundle_build_dir
: directorio desde el cual ejecutarbundle_build_cmd
, por defecto se establece enmanage_path
.virtualenv_python_version
: ejecutable de Python con versión, por defecto espython2.7
.pip_command
: comando utilizado para ejecutar pip, por defecto espip
, otro ejemplo espip3
.pip_path
: ruta absoluta al ejecutable de pip, por defecto es/usr/bin/{{ pip_command }}
.
Variables de Entorno
Las siguientes variables de entorno deben ser definidas por tu servicio django en container.yml para implementar este rol.
DJANGO_PORT
: número del puerto en el que se debe servir la aplicación Django.DJANGO_VENV
: ruta absoluta a la ubicación donde vivirá el entorno virtual de Python de la aplicación Django (por defecto: /venv).DJANGO_USER
: nombre del usuario que poseerá todos los archivos de la aplicación y ejecutará el proceso de la aplicación (por defecto: django).
Se proporcionan valores predeterminados razonables como variables de rol de Ansible en minúsculas para todos estos valores, que pueden ser inyectados en la etiqueta environment
de tu container.yml con comillas y llaves de YAML (por ejemplo, DJANGO_VENV: '{{ django_venv }}').
Inyectando secretos de Vault
Actualmente, ansible-container no admite archivos y variables de Vault encriptadas directamente en container.yml, pero puedes incrustar secretos en tus imágenes usando ansible-playbook ejecutándose desde el conductor.
En este rol, la variable django_environment es un diccionario de variables de entorno que se colocarán en un script postactivate que debe ejecutarse antes de cada llamada a manage.py de Django.
IMPORTANTE: esto significa que cualquier secreto que se conserve en la imagen destino será visible en la propia imagen (a menos que se aplaste durante la implementación), así como mediante la inspección en una instancia en ejecución de tu imagen.
Esta es la mejor solución disponible actualmente para incrustar secretos programáticamente usando ansible-container; siempre que no publiques tus imágenes construidas en un registro de contenedores público, esto no debería ser un gran problema.
Licencia
BSD
Información del Autor
Adaptado del proyecto de ejemplo de Django oficial de ansible-container.
Escrito por Marcus Levine para CKM Advisors.
Container-enabled role for configuring a Django app behind Gunicorn
ansible-galaxy install marcusianlevine.django-container