--- # Minecraft server deployment: a Quadlet pod running the Java server # (itzg/minecraft-server) and, when enabled, the Geyser bridge container # (geysermc/geyser) so Bedrock clients can join. Everything runs rootless # under the admin user. Containers share the pod's network namespace, so # Geyser reaches the Java server at 127.0.0.1. - name: Build the list of data directories ansible.builtin.set_fact: minecraft_data_dirs: >- {{ [minecraft_data_dir, minecraft_data_dir + '/data', minecraft_data_dir + '/backups'] + ([minecraft_data_dir + '/geyser'] if enable_geyser | bool else []) }} - name: Create the Minecraft data directory tree ansible.builtin.file: path: "{{ item }}" state: directory owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0750" loop: "{{ minecraft_data_dirs }}" - name: Restore SELinux context on the data directory ansible.builtin.command: restorecon -Rv {{ minecraft_data_dir }} changed_when: false - name: Create the Quadlet systemd unit directory ansible.builtin.file: path: "/home/{{ admin_user }}/.config/containers/systemd" state: directory owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0700" - name: Deploy the Minecraft pod unit ansible.builtin.template: src: minecraft.pod.j2 dest: "/home/{{ admin_user }}/.config/containers/systemd/minecraft.pod" owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0644" - name: Deploy the Minecraft Java server unit ansible.builtin.template: src: minecraft-server.container.j2 dest: "/home/{{ admin_user }}/.config/containers/systemd/minecraft-server.container" owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0644" - name: Deploy the Geyser config file ansible.builtin.template: src: geyser-config.yml.j2 dest: "{{ minecraft_data_dir }}/geyser/config.yml" owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0640" when: enable_geyser | bool - name: Deploy the Geyser bridge unit ansible.builtin.template: src: geyser.container.j2 dest: "/home/{{ admin_user }}/.config/containers/systemd/geyser.container" owner: "{{ admin_user }}" group: "{{ admin_user }}" mode: "0644" when: enable_geyser | bool - name: Build the list of images to pull ansible.builtin.set_fact: minecraft_images: "{{ [minecraft_image] + ([geyser_image] if enable_geyser | bool else []) }}" when: minecraft_prepull | bool - name: Check if container images are already present ansible.builtin.command: machinectl shell {{ admin_user }}@ -- podman image exists {{ item }} loop: "{{ minecraft_images }}" register: images_exist changed_when: false failed_when: false when: minecraft_prepull | bool - name: Pull missing container images ansible.builtin.command: machinectl shell {{ admin_user }}@ -- podman pull {{ item.item }} loop: "{{ images_exist.results }}" when: - minecraft_prepull | bool - item.rc != 0 - name: Build the list of user services to enable ansible.builtin.set_fact: minecraft_units: "{{ ['minecraft-pod.service', 'minecraft-server.service'] + (['geyser.service'] if enable_geyser | bool else []) }}" - name: Reload the user systemd daemon ansible.builtin.command: machinectl shell {{ admin_user }}@ -- systemctl --user daemon-reload changed_when: false - name: Enable and start the Minecraft services ansible.builtin.command: machinectl shell {{ admin_user }}@ -- systemctl --user enable --now {{ item }} loop: "{{ minecraft_units }}" register: mc_services changed_when: false