initial commital
This commit is contained in:
423
roles/minecraft-podman/tasks/main.yml
Normal file
423
roles/minecraft-podman/tasks/main.yml
Normal file
@@ -0,0 +1,423 @@
|
||||
---
|
||||
# =============================================================================
|
||||
# Minecraft Podman Deployment - Main Tasks
|
||||
# =============================================================================
|
||||
# This role deploys a Minecraft server using Podman on Fedora
|
||||
# with systemd integration for service management
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# System Preparation
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: System Preparation
|
||||
block:
|
||||
- name: Update DNF cache
|
||||
ansible.builtin.dnf:
|
||||
update_cache: true
|
||||
state: present
|
||||
tags: [install, packages]
|
||||
|
||||
- name: Install required packages
|
||||
ansible.builtin.dnf:
|
||||
name:
|
||||
- podman
|
||||
- podman-plugins # Podman plugins (Netavark, etc.)
|
||||
- fuse-overlayfs # Required for rootless storage
|
||||
- slirp4netns # Required for rootless networking
|
||||
- systemd-container # Systemd integration
|
||||
- firewalld
|
||||
- python3-firewall # For ansible firewalld module
|
||||
- python3-podman # For ansible podman modules
|
||||
- tar # For backups
|
||||
- gzip # For compressed backups
|
||||
- curl # For health checks
|
||||
state: present
|
||||
tags: [install, packages]
|
||||
|
||||
- name: Ensure Podman is installed
|
||||
ansible.builtin.command: podman --version
|
||||
register: podman_version
|
||||
changed_when: false
|
||||
tags: [install, verify]
|
||||
|
||||
- name: Display Podman version
|
||||
ansible.builtin.debug:
|
||||
msg: "Podman {{ podman_version.stdout }} installed"
|
||||
tags: [install, verify]
|
||||
|
||||
tags: [install, packages]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# User and Permissions
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: User Configuration
|
||||
block:
|
||||
- name: Create minecraft system user
|
||||
ansible.builtin.user:
|
||||
name: "{{ minecraft_user }}"
|
||||
system: true
|
||||
shell: /bin/bash
|
||||
home: "{{ paths.base_dir }}"
|
||||
create_home: false
|
||||
comment: "Minecraft Server User"
|
||||
when: minecraft_user != "root"
|
||||
tags: [install, user]
|
||||
|
||||
- name: Configure subuid for rootless podman
|
||||
ansible.builtin.lineinfile:
|
||||
path: /etc/subuid
|
||||
line: "{{ minecraft_user }}:100000:65536"
|
||||
regexp: "^{{ minecraft_user }}:"
|
||||
state: present
|
||||
create: true
|
||||
mode: "0644"
|
||||
when: minecraft_user != "root"
|
||||
tags: [install, user]
|
||||
|
||||
- name: Configure subgid for rootless podman
|
||||
ansible.builtin.lineinfile:
|
||||
path: /etc/subgid
|
||||
line: "{{ minecraft_user }}:100000:65536"
|
||||
regexp: "^{{ minecraft_user }}:"
|
||||
state: present
|
||||
create: true
|
||||
mode: "0644"
|
||||
when: minecraft_user != "root"
|
||||
tags: [install, user]
|
||||
|
||||
- name: Create user config directory for podman
|
||||
ansible.builtin.file:
|
||||
path: "{{ paths.base_dir }}/.config/containers"
|
||||
state: directory
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0755"
|
||||
when: minecraft_user != "root"
|
||||
tags: [install, user]
|
||||
|
||||
- name: Create user local share for podman storage
|
||||
ansible.builtin.file:
|
||||
path: "{{ paths.base_dir }}/.local/share/containers"
|
||||
state: directory
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0755"
|
||||
when: minecraft_user != "root"
|
||||
tags: [install, user]
|
||||
|
||||
- name: Ensure systemd lingering is enabled for user
|
||||
ansible.builtin.command: "loginctl enable-linger {{ minecraft_user }}"
|
||||
changed_when: false
|
||||
when: minecraft_user != "root"
|
||||
tags: [install, user]
|
||||
|
||||
tags: [install]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Directory Structure
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Directory Setup
|
||||
block:
|
||||
- name: Create base directories
|
||||
ansible.builtin.file:
|
||||
path: "{{ item }}"
|
||||
state: directory
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0755"
|
||||
loop:
|
||||
- "{{ paths.base_dir }}"
|
||||
- "{{ paths.data_dir }}"
|
||||
- "{{ paths.backup_dir }}"
|
||||
- "{{ paths.data_dir }}/logs"
|
||||
- "{{ paths.data_dir }}/world"
|
||||
tags: [install, directories]
|
||||
|
||||
- name: Create Containerfile directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ paths.base_dir }}/container"
|
||||
state: directory
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0755"
|
||||
tags: [install, container]
|
||||
|
||||
tags: [install]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Container Build (if using custom Containerfile)
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Container Build
|
||||
block:
|
||||
- name: Copy Containerfile
|
||||
ansible.builtin.template:
|
||||
src: Containerfile.j2
|
||||
dest: "{{ paths.base_dir }}/container/Containerfile"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0644"
|
||||
when: minecraft.use_custom_container | default(false)
|
||||
tags: [install, container]
|
||||
|
||||
- name: Build custom Minecraft container image
|
||||
containers.podman.podman_image:
|
||||
name: "{{ minecraft.custom_image_name | default('minecraft-custom') }}"
|
||||
build:
|
||||
path: "{{ paths.base_dir }}/container/"
|
||||
file: Containerfile
|
||||
tag: "{{ minecraft.version }}"
|
||||
state: present
|
||||
when: minecraft.use_custom_container | default(false)
|
||||
tags: [install, container]
|
||||
|
||||
tags: [install]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Server Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Server Configuration
|
||||
block:
|
||||
- name: Deploy server.properties
|
||||
ansible.builtin.template:
|
||||
src: server.properties.j2
|
||||
dest: "{{ paths.data_dir }}/server.properties"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0644"
|
||||
notify: restart minecraft
|
||||
tags: [config]
|
||||
|
||||
- name: Deploy eula.txt
|
||||
ansible.builtin.copy:
|
||||
content: "eula=true\n"
|
||||
dest: "{{ paths.data_dir }}/eula.txt"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0644"
|
||||
tags: [config]
|
||||
|
||||
- name: Deploy environment variables
|
||||
ansible.builtin.template:
|
||||
src: minecraft.env.j2
|
||||
dest: "{{ paths.base_dir }}/minecraft.env"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0600"
|
||||
notify: restart minecraft
|
||||
tags: [config]
|
||||
|
||||
- name: Deploy JVM options file
|
||||
ansible.builtin.template:
|
||||
src: jvm.opts.j2
|
||||
dest: "{{ paths.data_dir }}/jvm.opts"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0644"
|
||||
when: minecraft.jvm_opts_file | default(false)
|
||||
notify: restart minecraft
|
||||
tags: [config]
|
||||
|
||||
tags: [config]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Firewall Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Firewall Configuration
|
||||
block:
|
||||
- name: Ensure firewalld is running
|
||||
ansible.builtin.systemd:
|
||||
name: firewalld
|
||||
state: started
|
||||
enabled: true
|
||||
tags: [firewall]
|
||||
|
||||
- name: Open Minecraft port
|
||||
ansible.posix.firewalld:
|
||||
port: "{{ minecraft.port }}/tcp"
|
||||
permanent: true
|
||||
immediate: true
|
||||
state: enabled
|
||||
tags: [firewall]
|
||||
|
||||
- name: Open RCON port
|
||||
ansible.posix.firewalld:
|
||||
port: "{{ minecraft.rcon_port }}/tcp"
|
||||
permanent: true
|
||||
immediate: true
|
||||
state: enabled
|
||||
when: minecraft.rcon_enabled
|
||||
tags: [firewall]
|
||||
|
||||
- name: Open additional firewall ports
|
||||
ansible.posix.firewalld:
|
||||
port: "{{ item }}"
|
||||
permanent: true
|
||||
immediate: true
|
||||
state: enabled
|
||||
loop: "{{ firewall.additional_ports | default([]) }}"
|
||||
tags: [firewall]
|
||||
|
||||
tags: [firewall]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Systemd Service
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Systemd Service Configuration
|
||||
block:
|
||||
- name: Deploy systemd service unit
|
||||
ansible.builtin.template:
|
||||
src: minecraft.service.j2
|
||||
dest: "{{ paths.systemd_dir }}/{{ minecraft.server_name }}.service"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
notify:
|
||||
- reload systemd
|
||||
- restart minecraft
|
||||
tags: [service]
|
||||
|
||||
- name: Reload systemd daemon
|
||||
ansible.builtin.systemd:
|
||||
daemon_reload: true
|
||||
tags: [service]
|
||||
|
||||
- name: Enable and start Minecraft service
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ minecraft.server_name }}.service"
|
||||
state: started
|
||||
enabled: true
|
||||
tags: [service]
|
||||
|
||||
tags: [service]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Backup Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Backup Configuration
|
||||
block:
|
||||
- name: Deploy backup script
|
||||
ansible.builtin.template:
|
||||
src: backup.sh.j2
|
||||
dest: "{{ paths.base_dir }}/backup.sh"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0755"
|
||||
when: backup.enabled
|
||||
tags: [backup]
|
||||
|
||||
- name: Deploy restore script
|
||||
ansible.builtin.template:
|
||||
src: restore.sh.j2
|
||||
dest: "{{ paths.base_dir }}/restore.sh"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0755"
|
||||
when: backup.enabled
|
||||
tags: [backup]
|
||||
|
||||
- name: Create systemd timer for backups
|
||||
ansible.builtin.template:
|
||||
src: minecraft-backup.timer.j2
|
||||
dest: "{{ paths.systemd_dir }}/{{ minecraft.server_name }}-backup.timer"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
when: backup.enabled
|
||||
tags: [backup]
|
||||
|
||||
- name: Create systemd service for backups
|
||||
ansible.builtin.template:
|
||||
src: minecraft-backup.service.j2
|
||||
dest: "{{ paths.systemd_dir }}/{{ minecraft.server_name }}-backup.service"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
when: backup.enabled
|
||||
tags: [backup]
|
||||
|
||||
- name: Enable backup timer
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ minecraft.server_name }}-backup.timer"
|
||||
state: started
|
||||
enabled: true
|
||||
when: backup.enabled
|
||||
tags: [backup]
|
||||
|
||||
tags: [backup]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Health Check
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Health Check Configuration
|
||||
block:
|
||||
- name: Deploy health check script
|
||||
ansible.builtin.template:
|
||||
src: health-check.sh.j2
|
||||
dest: "{{ paths.base_dir }}/health-check.sh"
|
||||
owner: "{{ minecraft_user }}"
|
||||
group: "{{ minecraft_user }}"
|
||||
mode: "0755"
|
||||
when: monitoring.enabled
|
||||
tags: [monitoring]
|
||||
|
||||
- name: Create systemd timer for health checks
|
||||
ansible.builtin.template:
|
||||
src: minecraft-health.timer.j2
|
||||
dest: "{{ paths.systemd_dir }}/{{ minecraft.server_name }}-health.timer"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
when: monitoring.enabled
|
||||
tags: [monitoring]
|
||||
|
||||
- name: Create systemd service for health checks
|
||||
ansible.builtin.template:
|
||||
src: minecraft-health.service.j2
|
||||
dest: "{{ paths.systemd_dir }}/{{ minecraft.server_name }}-health.service"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
when: monitoring.enabled
|
||||
tags: [monitoring]
|
||||
|
||||
- name: Enable health check timer
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ minecraft.server_name }}-health.timer"
|
||||
state: started
|
||||
enabled: true
|
||||
when: monitoring.enabled
|
||||
tags: [monitoring]
|
||||
|
||||
tags: [monitoring]
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Final Verification
|
||||
# -----------------------------------------------------------------------------
|
||||
- name: Final Verification
|
||||
block:
|
||||
- name: Wait for Minecraft server to start
|
||||
ansible.builtin.uri:
|
||||
url: "http://localhost:{{ minecraft.port }}"
|
||||
return_content: false
|
||||
status_code: [401, 200] # Minecraft responds to HTTP with 401
|
||||
register: server_check
|
||||
retries: 30
|
||||
delay: 5
|
||||
until: server_check.status in [401, 200]
|
||||
ignore_errors: true
|
||||
tags: [verify]
|
||||
|
||||
- name: Check service status
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ minecraft.server_name }}.service"
|
||||
register: service_status
|
||||
tags: [verify]
|
||||
|
||||
- name: Display verification results
|
||||
ansible.builtin.debug:
|
||||
msg: |
|
||||
Server Status: {{ 'Running' if service_status.status.ActiveState == 'active' else 'Stopped' }}
|
||||
Service: {{ service_status.status.SubState }}
|
||||
Port {{ minecraft.port }}: {{ 'Open' if server_check is succeeded else 'Closed' }}
|
||||
tags: [verify]
|
||||
|
||||
tags: [verify]
|
||||
Reference in New Issue
Block a user