# update_minecraft.yml - name: Update Minecraft (Futurecraft) hosts: pve2_vm gather_facts: false vars: # Compose sync (controller -> target) 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" # Minecraft settings mc_project: minecraft mc_compose_filename: "docker-compose-minecraft.yml" mc_service: mc mc_port: 25565 # Persistent env file on the VM (NOT in git) # Must contain: CF_API_KEY, RCON_PASSWORD, optionally MEMORY mc_env_persistent: "{{ compose_remote_base }}/env/minecraft.env" # Container name from your compose file (used for log readiness check) mc_container_name: "mc-futurecraft" tasks: - name: Ensure remote base directory exists ansible.builtin.file: path: "{{ compose_remote_base }}" state: directory mode: "0755" - name: Ensure remote env directory exists ansible.builtin.file: path: "{{ compose_remote_base }}/env" state: directory mode: "0755" - name: Fail if persistent Minecraft env file is missing ansible.builtin.stat: path: "{{ mc_env_persistent }}" register: mc_env_stat - name: Abort when Minecraft env is missing ansible.builtin.fail: msg: >- Missing persistent env file: {{ mc_env_persistent }}. Create it on the VM with at least: CF_API_KEY=... RCON_PASSWORD=... Optional: MEMORY=8G when: not mc_env_stat.stat.exists - 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 }}" mode: "0644" - 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 mode: "0755" - name: Extract archive on remote host ansible.builtin.unarchive: src: "{{ compose_remote_archive }}" dest: "{{ compose_remote_dir }}" remote_src: true - name: Deploy Minecraft .env into compose directory ansible.builtin.copy: src: "{{ mc_env_persistent }}" dest: "{{ compose_remote_dir }}/.env" remote_src: true mode: "0600" - name: Pull latest Minecraft images community.docker.docker_compose_v2: project_name: "{{ mc_project }}" project_src: "{{ compose_remote_dir }}" files: - "{{ mc_compose_filename }}" pull: always - name: Recreate Minecraft stack community.docker.docker_compose_v2: project_name: "{{ mc_project }}" project_src: "{{ compose_remote_dir }}" files: - "{{ mc_compose_filename }}" state: present recreate: always - name: Wait for Minecraft port ansible.builtin.wait_for: host: 127.0.0.1 port: "{{ mc_port }}" timeout: 180 - name: Wait until server reports "Done" in logs (ready) community.docker.docker_container_logs: container: "{{ mc_container_name }}" tail: 200 register: mc_logs retries: 60 delay: 5 until: > (mc_logs.logs is defined) and ( 'Done (' in mc_logs.logs or 'Done (' in (mc_logs.log | default('')) ) changed_when: false