marcusianlevine.django-container

ansible-django-container

为您的 Ansible Container 项目添加一个基于 Gunicorn 的 Django 服务。运行以下命令安装此服务:

# 设置工作目录为您的 Ansible Container 项目根目录
$ cd myproject

# 安装服务
$ ansible-container install marcusianlevine.ansible-django-container

需求

  • Ansible Container

  • 一个现有的 Ansible Container 项目。要创建项目,只需运行以下命令:

    # 创建一个空的项目目录
    $ mkdir myproject
    
    # 设置工作目录为新目录
    $ cd myproject
    
    # 初始化项目
    $ ansible-container init
    
  • 默认情况下,此角色会在容器中创建一个名为 "django" 的用户。在部署过程中,容器的入口进程应以此用户身份运行。

  • 您的 Django 项目的 requirements.txt 必须包含 gunicorn

  • 除了运行 collectstatic 和将您的静态文件嵌入生成的 Docker 镜像之外,此角色还支持通过 Docker 卷将您的静态文件转移到例如 nginx 容器。

    • 此行为通过将静态文件复制到调度器来实现,因此它们可以复制到通过相同 ansible-container 管道构建的任何其他容器中。

角色变量

注意:为了帮助区分 Ansible 和环境变量,Ansible 上下文中的变量使用小写(this_is_ansible),而环境变量将始终使用大写(ENVIRONMENT_VARIABLE)。

Ansible 角色变量

这些变量可以在 container.yml 中的角色包含时重写,也可以通过在文件中指定变量并将其包含在 container.yml 中的 var_files 角色变量中,路径相对于 /src(这是 ansible-container 调度器上安装您项目源代码的路径)。

  • project_name: Django 项目文件夹和项目应用的名称(假设标准的 Django 文件夹结构)

  • django_environment: 将注入到 virtualenv postactivate 脚本中的环境变量定义字典(示例见 defaults/main.yml)

  • requirements_file: 如果您的 Django 应用的要求文件不在仓库的根目录下,可以用来指定相对文件路径

  • core_source_files: 默认情况下,requirements_file 和您仓库中与 project_name 匹配的顶级目录将打包到容器中。可以在此处指定需要构建到镜像中的其他源文件。

  • django_static_root: 指定 Django 将收集静态文件的目录。这应该与 Django 设置中的 STATIC_ROOT 的值匹配,或者从在 django_environment 中指定的 postactivate 环境变量加载 os.environ

  • django_media_root: 与 django_static_root 相同,但针对 MEDIA_ROOT Django 设置。

  • manage_path: 项目 manage.py 脚本的位置,默认为与 project_name 匹配的顶级目录。

  • django_rpm_depsdjango_apt_deps: apt 或 yum 的包名列表,具体取决于您的目标发行版(请注意,同一软件包在另一个软件包库中的名称可能略有不同)。

  • script_templates: 提供一系列相对路径(相对于 /src,ansible-container 调度器上挂载您项目的路径)以获取希望打包到镜像中的额外 Jinja2(或纯文本)脚本文件。

    • 注意:每个文件名的最终扩展将被截断,因此 scripts/gunicorn_start.j2 将在镜像中模板化为 /usr/bin/gunicorn_start
  • bundle_build_cmd: 如果您需要构建 Webpack 或类似的包,请在此提供要运行的命令。

    • 注意:任何运行此构建命令所需的系统依赖项必须在此角色之前安装。
  • bundle_build_dir: 从哪里运行 bundle_build_cmd,默认为 manage_path

  • virtualenv_python_version: 带版本的 Python 可执行文件,默认为 python2.7

  • pip_command: 用于执行 pip 的命令,默认为 pip,另一个示例是 pip3

  • pip_path: pip 可执行文件的绝对路径,默认为 /usr/bin/{{ pip_command }}

环境变量

您的 container.yml django 服务必须定义以下环境变量,以便部署此角色。

  • DJANGO_PORT: Django 应用应使用的端口号。
  • DJANGO_VENV: Django 应用的 Python 虚拟环境的绝对路径(默认:/venv)。
  • DJANGO_USER: 拥有所有应用程序文件并运行应用程序进程的用户名称(默认:django)。

为所有这些值提供了合理的默认小写 Ansible 角色变量,可以通过引号和 YAML 大括号将其注入到您的 container.yml environment 标签中(例如 DJANGO_VENV: '{{ django_venv }}')

注入 Vault 秘密

目前 ansible-container 不支持在 container.yml 中直接使用 Vault 加密文件和变量,但您可以通过在调度器上运行 ansible-playbook 将秘密嵌入到镜像中。

在此角色中,django_environment 变量是一个环境变量字典,将放入一个 postactivate 脚本中,该脚本必须在每次 Django manage.py 调用之前运行。

重要提示:这意味着任何在目标镜像中持久化的秘密将在映像本身中可见(除非在部署过程中被平坦化),以及通过检查正在运行的图像实例可见。

这是当前使用 ansible-container 程序化嵌入秘密的最佳解决方案;只要您不将构建的图像发布到公共容器注册表,这个问题不应太大。

许可证

BSD

作者信息

改编自 官方 ansible-container Django 示例项目

由 Marcus Levine 为 CKM Advisors 编写。

关于项目

Container-enabled role for configuring a Django app behind Gunicorn

安装
ansible-galaxy install marcusianlevine.django-container
许可证
bsd-3-clause
下载
657
拥有者
Data Science + DevOps = DataEng