--- # Deploy one Django app+env as its own docker compose project. # Called per item with loop_var app_item = { name, env, port }. - name: "django[{{ app_item.name }}/{{ app_item.env }}] locals" ansible.builtin.set_fact: _spec: "{{ app_catalog[app_item.name] }}" _src: "{{ apps_src_dir }}/{{ app_item.name }}_{{ app_item.env }}" _envfile: "{{ apps_env_dir }}/{{ app_item.name }}_{{ app_item.env }}.env" _secret_src: "{{ secrets_dir }}/{{ app_item.name }}/{{ app_item.name }}_{{ app_item.env }}.env" _project: "{{ app_item.name }}_{{ app_item.env }}" _ref: "{{ app_ref | default(app_catalog[app_item.name].default_branch) }}" - name: "django[{{ _project }}] ensure base dirs" ansible.builtin.file: path: "{{ item }}" state: directory owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0750" loop: - "{{ apps_src_dir }}" - "{{ apps_env_dir }}" - name: "django[{{ _project }}] check local secret exists" ansible.builtin.stat: path: "{{ _secret_src }}" register: _secret_stat delegate_to: localhost become: false - name: "django[{{ _project }}] fail when local secret missing" ansible.builtin.fail: msg: >- Missing local secret {{ _secret_src }} on the control node. Create it (DATABASE_URL to the shared external Postgres, DJANGO_SECRET_KEY, WEB_PORT={{ app_item.port }}, etc.) before deploying. It is never committed to git. when: not _secret_stat.stat.exists - name: "django[{{ _project }}] push secret to {{ _envfile }}" ansible.builtin.copy: src: "{{ _secret_src }}" dest: "{{ _envfile }}" owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0600" - name: "django[{{ _project }}] checkout {{ _ref }}" ansible.builtin.git: repo: "{{ _spec.repo }}" dest: "{{ _src }}" version: "{{ _ref }}" force: true accept_hostkey: true become: true become_user: "{{ admin_user }}" - name: "django[{{ _project }}] install .env into checkout" ansible.builtin.copy: src: "{{ _envfile }}" dest: "{{ _src }}/.env" remote_src: true owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0600" - name: "django[{{ _project }}] build images" ansible.builtin.command: cmd: "docker compose -f {{ _spec.compose_file }} --env-file .env build" chdir: "{{ _src }}" environment: COMPOSE_PROJECT_NAME: "{{ _project }}" WEB_PORT: "{{ app_item.port }}" become: true become_user: "{{ admin_user }}" changed_when: true - name: "django[{{ _project }}] start containers" ansible.builtin.command: cmd: "docker compose -f {{ _spec.compose_file }} --env-file .env up -d --remove-orphans" chdir: "{{ _src }}" environment: COMPOSE_PROJECT_NAME: "{{ _project }}" WEB_PORT: "{{ app_item.port }}" become: true become_user: "{{ admin_user }}" changed_when: true