# update_semaphore.yml - name: Update Semaphore (self-update safe) hosts: pve2_vm gather_facts: false vars: compose_local_dir: "{{ playbook_dir }}/docker-compose" compose_remote_base: "/home/{{ ansible_user }}/.ansible-compose" compose_remote_dir: "{{ compose_remote_base }}/docker-compose" compose_remote_archive: "{{ compose_remote_base }}/docker-compose.tar.gz" semaphore_project: semaphore semaphore_compose_filename: "docker-compose-semaphore.yml" semaphore_port: 3000 tasks: - name: Ensure remote base directory exists ansible.builtin.file: path: "{{ compose_remote_base }}" state: directory - name: Create local archive of docker-compose directory (controller) ansible.builtin.archive: path: "{{ compose_local_dir }}/" dest: "/tmp/docker-compose.tar.gz" format: gz delegate_to: localhost run_once: true - name: Upload archive to remote host ansible.builtin.copy: src: "/tmp/docker-compose.tar.gz" dest: "{{ compose_remote_archive }}" - name: Recreate remote compose directory ansible.builtin.file: path: "{{ compose_remote_dir }}" state: absent - name: Ensure remote compose directory exists ansible.builtin.file: path: "{{ compose_remote_dir }}" state: directory - name: Extract archive on remote host ansible.builtin.unarchive: src: "{{ compose_remote_archive }}" dest: "{{ compose_remote_dir }}" remote_src: true - name: Pull latest Semaphore image(s) ansible.builtin.command: argv: - bash - -lc - > cd "{{ compose_remote_dir }}" && docker compose -p "{{ semaphore_project }}" -f "{{ semaphore_compose_filename }}" pull changed_when: true - name: Start Semaphore update in background (avoid killing this job) ansible.builtin.command: argv: - bash - -lc - > cd "{{ compose_remote_dir }}" && nohup docker compose -p "{{ semaphore_project }}" -f "{{ semaphore_compose_filename }}" up -d --remove-orphans --force-recreate > "{{ compose_remote_base }}/semaphore-update.log" 2>&1 & async: 1 poll: 0 changed_when: true - name: Wait for Semaphore port ansible.builtin.wait_for: host: 127.0.0.1 port: "{{ semaphore_port }}" timeout: 300 - name: Check Semaphore HTTP endpoint (retry) ansible.builtin.uri: url: "http://127.0.0.1:{{ semaphore_port }}/" status_code: 200 register: sem_http retries: 30 delay: 5 until: sem_http.status == 200 changed_when: false