Files
external-minecraft/roles/minecraft/tasks/main.yml
2026-09-12 14:31:27 -06:00

101 lines
3.5 KiB
YAML

---
# 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