marcusianlevine.django-container
ansible-django-container
为您的 Ansible Container 项目添加一个基于 Gunicorn 的 Django 服务。运行以下命令安装此服务:
# 设置工作目录为您的 Ansible Container 项目根目录
$ cd myproject
# 安装服务
$ ansible-container install marcusianlevine.ansible-django-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_deps
和django_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 编写。