101 lines
3.5 KiB
YAML
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 |