--- # Generic app deployment. # # CI passes: app= app_env= app_ref= # Manual run with none of those redeploys every app in this host's host_apps # at branch master. # # host_apps (host_vars) lists what runs on THIS host; app_catalog (group_vars) # describes how each app is built. - name: Classify catalog by type ansible.builtin.set_fact: django_names: "{{ app_catalog | dict2items | selectattr('value.type', 'equalto', 'django') | map(attribute='key') | list }}" node_names: "{{ app_catalog | dict2items | selectattr('value.type', 'equalto', 'node-static') | map(attribute='key') | list }}" - name: Resolve deploy targets for {{ inventory_hostname }} ansible.builtin.set_fact: deploy_targets: >- {{ (host_apps | default([]) | selectattr('name', 'equalto', app | default('')) | selectattr('env', 'equalto', app_env | default('')) | list) if (app is defined and app_env is defined) else (host_apps | default([])) }} - name: Show deploy targets ansible.builtin.debug: msg: "ref={{ app_ref | default('(per-app default branch)') }} targets={{ deploy_targets | map(attribute='name') | zip(deploy_targets | map(attribute='env')) | list }}" - name: Deploy Django (docker compose) apps ansible.builtin.include_tasks: django.yml loop: "{{ deploy_targets | selectattr('name', 'in', django_names) | list }}" loop_control: loop_var: app_item label: "{{ app_item.name }}/{{ app_item.env }}" - name: Run Django migrations once (shared external DB) ansible.builtin.command: cmd: >- docker compose -f {{ app_catalog[item.name].compose_file }} --env-file .env exec -T {{ app_catalog[item.name].web_service }} {{ app_catalog[item.name].migrate_cmd }} chdir: "{{ apps_src_dir }}/{{ item.name }}_{{ item.env }}" environment: COMPOSE_PROJECT_NAME: "{{ item.name }}_{{ item.env }}" loop: "{{ deploy_targets | selectattr('name', 'in', django_names) | list }}" loop_control: label: "{{ item.name }}/{{ item.env }}" become: true become_user: "{{ admin_user }}" run_once: true changed_when: true - name: Deploy node static apps ansible.builtin.include_tasks: node_static.yml loop: "{{ deploy_targets | selectattr('name', 'in', node_names) | list }}" loop_control: loop_var: app_item label: "{{ app_item.name }}/{{ app_item.env }}"