Files
config-public/ansible/roles/compose_stack/tasks/up.yml
T
Lucas WintherandClaude Opus 5.5 78b227f32d Add a start flag, and let --check survive a first deploy
-e start=false (mode sync in CI) lands the payload and starts nothing, for
migrations. A check run on a never-deployed stack now skips Compose with a note
instead of failing on the missing directory.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 15:04:56 +02:00

65 lines
2.8 KiB
YAML

---
# docker_compose_v2 validates project_src with os.path.isdir, which is false both
# for a path that is missing and for one that is a file, and reports either as
# `"..." is not a directory`. Stat it first so the two are told apart here rather
# than left to that one message.
- name: Look for the stack directory on the host
ansible.builtin.stat:
path: "{{ stack_dest }}"
register: compose_stack_dir
changed_when: false
- name: Verify the stack directory is a directory
ansible.builtin.assert:
that:
- compose_stack_dir.stat.isdir | default(false)
fail_msg: >-
{{ stack_dest }} exists on {{ inventory_hostname }} but is not a directory
quiet: true
when: compose_stack_dir.stat.exists
# A check run creates nothing, so on a host that has never deployed this stack
# there is no project directory for the module to inspect and it fails on its
# absence — a first `--check` would report the payload diff correctly and then
# die for a reason that says nothing about the stack. Skip it instead; the sync
# tasks above have already reported everything check mode can know.
- name: Note that the stack cannot be checked before its first deploy
ansible.builtin.debug:
msg: >-
{{ stack_dest }} does not exist yet, so the compose step was skipped.
Deploy for real to create it.
when:
- stack_start | bool
- ansible_check_mode
- not compose_stack_dir.stat.exists
# The counterpart to that message, for `-e start=false`. Without it the play ends
# with the compose task skipped and nothing saying so, which reads exactly like a
# run that quietly failed to do its job.
- name: Note that the stack was synced but deliberately not started
ansible.builtin.debug:
msg: >-
start=false, so the payload is on {{ inventory_hostname }} and
{{ stack_name }} was left as it was. Run again without the flag to start
it.
when: not stack_start | bool
- name: Bring the stack up
community.docker.docker_compose_v2:
project_src: "{{ stack_dest }}"
files: "{{ stack_files }}"
state: "{{ stack_state }}"
pull: "{{ stack_pull }}"
build: "{{ stack_build }}"
remove_orphans: true
# A compose file that interpolates ${PWD} — a common way to hand a host path to
# a sibling container — resolves it against the *invoking shell*, not the
# project directory. The module sets the process working directory but not PWD,
# so ${PWD} would silently become the SSH login directory. Set it explicitly.
environment: "{{ {'PWD': stack_dest} | combine(stack_env) }}"
# stack_start is gated here rather than around the include in main.yml, because
# a two-phase playbook calls tasks_from: up directly and main.yml never sees it.
when:
- stack_start | bool
- compose_stack_dir.stat.exists or not ansible_check_mode