--- - name: Check the Caddyfile exists stat: path: '{{ caddyfile_path }}' register: menu_caddyfile - name: Fail when Caddy is not where we expect it fail: msg: >- {{ caddyfile_path }} is missing. Deploy the caddy playbook, which owns the Caddy container and its config, before this one. when: not menu_caddyfile.stat.exists # The Site's web address may still be claimed by an older snippet: the retired # nginx-menu playbook wrote one per hostname. Two blocks for one address make # Caddy refuse the whole config, and a refused reload leaves the old proxy in # place, which is a 502 once the old container is gone. - name: Drop any older snippet claiming this web address blockinfile: path: '{{ caddyfile_path }}' marker: '# {mark} Ansible managed Caddy snippet for {{ host }}' state: absent notify: Reload Caddy # blockinfile replaces whatever sits between its markers, so redeploying updates # the snippet in place rather than appending a second one. - name: Point the Site's web address at the app blockinfile: path: '{{ caddyfile_path }}' marker: '# {mark} ANSIBLE MANAGED: menu app ({{ site }})' block: '{{ caddy_snippet }}' create: no notify: Reload Caddy