marcusianlevine.django-container
ansible-django-container
Gunicornで動作するDjangoサービスをあなたのAnsible Containerプロジェクトに追加します。サービスをインストールするには、以下のコマンドを実行してください。
# 作業ディレクトリをあなたの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イメージに静的ファイルを埋め込むだけでなく、静的ファイルをe.g. nginxコンテナにdockerボリュームを介して転送することもサポートします。
- この動作は、静的ファイルをコントラクターにコピーして、同じansible-containerパイプラインで作成された他のコンテナにコピーできるようにすることで実現されます。
ロール変数
注意:Ansibleと環境変数の違いを明確にするために、Ansibleコンテキストでの変数は小文字になります (this_is_ansible)、一方、環境変数は常に大文字になります (ENVIRONMENT_VARIABLE)。
Ansibleロール変数
これらの変数は、ロールの含まれているcontainer.ymlでオーバーライドするか、ファイルに変数を指定し、container.yml内のvar_files
ロール変数として/srcに対する相対パスで含めることができます。
project_name
: Djangoプロジェクトフォルダとプロジェクトアプリの名前(標準Djangoフォルダ構造を前提としています)django_environment
: virtualenvのpostactivateスクリプトに挿入される環境変数の定義を含む辞書(例はdefaults/main.ymlを参照)requirements_file
: Djangoアプリのrequirementsファイルがリポジトリのルートにない場合、相対ファイルパスを指定できます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
と同じ機能を持ちますが、DjangoのMEDIA_ROOT
設定に対応します。manage_path
: プロジェクトのmanage.pyスクリプトの場所で、デフォルトはproject_name
に一致するトップレベルディレクトリです。django_rpm_deps
およびdjango_apt_deps
: 対象のディストリビューションに応じたaptまたはyumのパッケージ名のリスト(同じパッケージは別のパッケージリポジトリでわずかに異なる名前を持つ場合があります)。script_templates
: /srcに対する相対パスのJinja2(またはプレーンテキスト)スクリプトファイルのリストを提供し、/usr/bin/に組み込みたいスクリプトファイルのパスを指定します。- 注:各ファイル名の最終拡張子は省略されるため、
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ロール変数として提供されており、これらをcontainer.ymlのenvironment
タグに引用符とYAMLの波かっこで注入することができます(例:DJANGO_VENV: '{{ django_venv }}')。
Vaultの秘密を注入する
現在、ansible-containerはcontainer.yml内でVault暗号化ファイルや変数を直接サポートしていませんが、コントラクターから実行されるansible-playbookを使用して、イメージ内に秘密を埋め込むことができます。
このロールでは、django_environment変数はpostactivateスクリプトに配置される環境変数の辞書であり、これはDjango manage.pyの呼び出しの前に実行されなければなりません。
重要:これは、ターゲットイメージに永続化される秘密が、イメージ自体(デプロイ中にフラット化しない限り)や、実行中のインスタンスの検査により見えることを意味します。
これは、ansible-containerを使用して秘密をプログラム的に埋め込むための現在利用できる最良の解決策です;構築したイメージを公開されているコンテナレジストリに公開しない限り、あまり気にしなくても良いでしょう。
ライセンス
BSD
著者情報
公式ansible-container Djangoの例プロジェクトから適応されました。
CKM AdvisorsのためにMarcus Levineによって書かれました。