test other version
Some checks failed
Ansible Minecraft CI/CD Pipeline / Ansible Lint Check (push) Successful in 58s
Ansible Minecraft CI/CD Pipeline / Project Structure Validation (push) Failing after 3s
Ansible Minecraft CI/CD Pipeline / Security Scan (push) Successful in 4s
Ansible Minecraft CI/CD Pipeline / Deploy to Staging (push) Has been skipped
Ansible Minecraft CI/CD Pipeline / Deploy to Production (push) Has been skipped
Ansible Minecraft CI/CD Pipeline / Backup System Check (push) Has been skipped

This commit is contained in:
2025-08-26 21:59:21 +02:00
parent b2459a2dc0
commit 7a2ccb537b
98 changed files with 2830 additions and 1291 deletions

View File

@@ -1,14 +1,35 @@
---
minecraft_version: "1.21.6"
# Minecraft user and group
minecraft_user: minecraft
minecraft_group: minecraft
minecraft_home: /opt/minecraft
minecraft_memory_min: "1G"
minecraft_memory_max: "4G"
minecraft_port: 25565
minecraft_rcon_port: 25575
minecraft_rcon_password: "changeme"
spigot_build_tools_url: "https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar"
# Minecraft directories
minecraft_base_dir: /opt/minecraft
minecraft_sources_dir: "{{ minecraft_base_dir }}/sources"
minecraft_server_dir: "{{ minecraft_base_dir }}/server"
minecraft_tools_dir: "{{ minecraft_base_dir }}/tools"
minecraft_plugins_dir: "{{ minecraft_server_dir }}/plugins"
# Minecraft configuration
minecraft_version: "1.21.6"
minecraft_memory_min: "1G"
minecraft_memory_max: "2G"
minecraft_port: 25565
minecraft_eula: true
# Server properties
server_name: "Minecraft Server"
server_motd: "A Minecraft Server"
max_players: 20
difficulty: "normal"
gamemode: "survival"
pvp_enabled: true
# MCRCON configuration
mcrcon_version: "0.7.2"
mcrcon_url: "https://github.com/Tiiffi/mcrcon/releases/download/v{{ mcrcon_version }}/mcrcon-{{ mcrcon_version }}-linux-x86-64.tar.gz"
rcon_enabled: true
rcon_port: 25575
rcon_password: "changeme"
# Default operators (will be populated from ops_list variable)
minecraft_ops: []

View File

@@ -1,21 +1,18 @@
---
- name: reload systemd
systemd:
daemon_reload: yes
- name: enable minecraft service
systemd:
name: minecraft
enabled: yes
- name: restart minecraft
systemd:
ansible.builtin.systemd:
name: minecraft
state: restarted
enabled: yes
daemon_reload: true
listen: "restart minecraft service"
- name: start minecraft
systemd:
name: minecraft
state: started
enabled: yes
- name: reload systemd
ansible.builtin.systemd:
daemon_reload: true
listen: "systemd daemon reload"
- name: restart logrotate
ansible.builtin.systemd:
name: logrotate
state: restarted
listen: "restart log rotation"

View File

@@ -0,0 +1,15 @@
---
- name: Create minecraft group
ansible.builtin.group:
name: "{{ minecraft_group }}"
state: present
- name: Create minecraft user
ansible.builtin.user:
name: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
home: "{{ minecraft_base_dir }}"
shell: /bin/bash
system: true
create_home: false
state: present

View File

@@ -1,6 +0,0 @@
---
- name: Create minecraft group
group:
name: "{{ minecraft_group }}"
state: present
tags: ['minecraft-user']

View File

@@ -1,15 +1,16 @@
---
- name: Create minecraft directories
file:
- name: Create minecraft base directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'
loop:
- "{{ minecraft_home }}"
- "{{ minecraft_base_dir }}"
- "{{ minecraft_sources_dir }}"
- "{{ minecraft_server_dir }}"
- "{{ minecraft_tools_dir }}"
- "{{ minecraft_backups_dir }}"
tags: ['minecraft-directories']
- "{{ minecraft_plugins_dir }}"
- "{{ minecraft_base_dir }}/logs"
- "{{ minecraft_base_dir }}/backups"

View File

@@ -1,9 +1,9 @@
---
- name: Download BuildTools.jar
get_url:
url: "{{ spigot_build_tools_url }}"
- name: Download BuildTools
ansible.builtin.get_url:
url: "https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar"
dest: "{{ minecraft_sources_dir }}/BuildTools.jar"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
tags: ['spigot-download']
timeout: 300

View File

@@ -1,17 +1,32 @@
---
- name: Download mcrcon
get_url:
url: "{{ mcrcon_url }}"
dest: "{{ minecraft_tools_dir }}/mcrcon.tar.gz"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
tags: ['mcrcon-install']
- name: Install packages needed for MCRCON compilation
ansible.builtin.apt:
name:
- git
- build-essential
state: present
- name: Extract mcrcon
unarchive:
src: "{{ minecraft_tools_dir }}/mcrcon.tar.gz"
dest: "{{ minecraft_tools_dir }}"
remote_src: yes
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
tags: ['mcrcon-install']
- name: Clone MCRCON repository
ansible.builtin.git:
repo: "https://github.com/Tiiffi/mcrcon.git"
dest: "{{ minecraft_tools_dir }}/mcrcon"
version: "v{{ mcrcon_version }}"
force: true
become_user: "{{ minecraft_user }}"
- name: Compile MCRCON
ansible.builtin.shell: |
cd {{ minecraft_tools_dir }}/mcrcon
make
become_user: "{{ minecraft_user }}"
args:
creates: "{{ minecraft_tools_dir }}/mcrcon/mcrcon"
- name: Install MCRCON binary
ansible.builtin.copy:
src: "{{ minecraft_tools_dir }}/mcrcon/mcrcon"
dest: "/usr/local/bin/mcrcon"
owner: root
group: root
mode: '0755'
remote_src: true

View File

@@ -1,19 +1,19 @@
---
- name: Compile Spigot server
shell: |
- name: Compile Spigot with BuildTools
ansible.builtin.shell: |
cd {{ minecraft_sources_dir }}
java -jar BuildTools.jar --rev {{ minecraft_version }}
become_user: "{{ minecraft_user }}"
args:
creates: "{{ minecraft_sources_dir }}/spigot-{{ minecraft_version }}.jar"
tags: ['spigot-compile']
register: spigot_compilation
timeout: 1800
- name: Copy compiled Spigot to server directory
copy:
ansible.builtin.copy:
src: "{{ minecraft_sources_dir }}/spigot-{{ minecraft_version }}.jar"
dest: "{{ minecraft_server_dir }}/spigot.jar"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
remote_src: yes
tags: ['spigot-compile']
remote_src: true

View File

@@ -0,0 +1,17 @@
---
- name: Create server.properties
ansible.builtin.template:
src: server.properties.j2
dest: "{{ minecraft_server_dir }}/server.properties"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
notify: "restart minecraft service"
- name: Accept EULA
ansible.builtin.copy:
content: "eula={{ minecraft_eula | ternary('true', 'false') }}"
dest: "{{ minecraft_server_dir }}/eula.txt"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'

View File

@@ -1,37 +0,0 @@
---
- name: Generate server.properties
template:
src: server.properties.j2
dest: "{{ minecraft_server_dir }}/server.properties"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
tags: ['minecraft-config']
- name: Generate spigot.yml
template:
src: spigot.yml.j2
dest: "{{ minecraft_server_dir }}/spigot.yml"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
tags: ['minecraft-config']
- name: Generate bukkit.yml
template:
src: bukkit.yml.j2
dest: "{{ minecraft_server_dir }}/bukkit.yml"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
tags: ['minecraft-config']
- name: Accept EULA
lineinfile:
path: "{{ minecraft_server_dir }}/eula.txt"
line: "eula=true"
create: yes
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
tags: ['minecraft-config']

View File

@@ -1,10 +0,0 @@
---
- name: Create systemd service file
template:
src: minecraft.service.j2
dest: /etc/systemd/system/minecraft.service
mode: '0644'
notify:
- reload systemd
- enable minecraft service
tags: ['minecraft-service']

View File

@@ -0,0 +1,17 @@
---
- name: Create Minecraft systemd service
ansible.builtin.template:
src: minecraft.service.j2
dest: /etc/systemd/system/minecraft.service
owner: root
group: root
mode: '0644'
notify:
- "systemd daemon reload"
- "restart minecraft service"
- name: Enable Minecraft service
ansible.builtin.systemd:
name: minecraft
enabled: true
daemon_reload: true

View File

@@ -1,7 +1,9 @@
---
- name: Setup log rotation for Minecraft
template:
- name: Configure log rotation for Minecraft
ansible.builtin.template:
src: logrotate-minecraft.j2
dest: /etc/logrotate.d/minecraft
owner: root
group: root
mode: '0644'
tags: ['minecraft-logs']
notify: "restart log rotation"

View File

@@ -1,9 +1,10 @@
---
- name: Configure ops.json
template:
- name: Create ops.json file
ansible.builtin.template:
src: ops.json.j2
dest: "{{ minecraft_server_dir }}/ops.json"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
tags: ['minecraft-ops']
when: minecraft_ops is defined and minecraft_ops | length > 0
notify: "restart minecraft service"

View File

@@ -0,0 +1,23 @@
---
- name: Ensure plugins directory exists with correct permissions
ansible.builtin.file:
path: "{{ minecraft_plugins_dir }}"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'
- name: Create plugins management script
ansible.builtin.copy:
content: |
#!/bin/bash
# Plugin management script
PLUGINS_DIR="{{ minecraft_plugins_dir }}"
echo "Minecraft plugins directory: $PLUGINS_DIR"
echo "Current plugins:"
ls -la "$PLUGINS_DIR"
dest: "{{ minecraft_tools_dir }}/manage-plugins.sh"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'

View File

@@ -1,20 +0,0 @@
---
- name: Create plugins directory
file:
path: "{{ minecraft_server_dir }}/plugins"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'
tags: ['minecraft-plugins']
- name: Download plugins if specified
get_url:
url: "{{ item.url }}"
dest: "{{ minecraft_server_dir }}/plugins/{{ item.name }}"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0644'
loop: "{{ minecraft_plugins | default([]) }}"
when: minecraft_plugins is defined
tags: ['minecraft-plugins']

View File

@@ -1,40 +1,30 @@
---
- name: Include user and group creation tasks
include_tasks: 01-create-user-group.yml
tags: ['minecraft', 'user']
- name: Include minecraft user creation tasks
ansible.builtin.include_tasks: 01-create-minecraft-user.yml
- name: Include directory creation tasks
include_tasks: 02-create-directories.yml
tags: ['minecraft', 'directories']
ansible.builtin.include_tasks: 02-create-directories.yml
- name: Include Spigot download tasks
include_tasks: 03-download-spigot.yml
tags: ['minecraft', 'download']
ansible.builtin.include_tasks: 03-download-spigot.yml
- name: Include mcrcon installation tasks
include_tasks: 04-install-mcrcon.yml
tags: ['minecraft', 'mcrcon']
- name: Include MCRCON installation tasks
ansible.builtin.include_tasks: 04-install-mcrcon.yml
- name: Include Spigot compilation tasks
include_tasks: 05-compile-spigot.yml
tags: ['minecraft', 'compile']
ansible.builtin.include_tasks: 05-compile-spigot.yml
- name: Include server configuration tasks
include_tasks: 06-configure-server.yml
tags: ['minecraft', 'configure']
- name: Include Minecraft configuration tasks
ansible.builtin.include_tasks: 06-configure-minecraft.yml
- name: Include service creation tasks
include_tasks: 07-create-service.yml
tags: ['minecraft', 'service']
- name: Include systemd service setup tasks
ansible.builtin.include_tasks: 07-setup-systemd-service.yml
- name: Include log rotation setup tasks
include_tasks: 08-setup-log-rotation.yml
tags: ['minecraft', 'logs']
ansible.builtin.include_tasks: 08-setup-log-rotation.yml
- name: Include ops configuration tasks
include_tasks: 09-configure-ops.yml
tags: ['minecraft', 'ops']
- name: Include ops management setup tasks
ansible.builtin.include_tasks: 09-setup-ops-management.yml
- name: Include plugins setup tasks
include_tasks: 10-setup-plugins.yml
tags: ['minecraft', 'plugins']
- name: Include plugins directory setup tasks
ansible.builtin.include_tasks: 10-setup-plugins-directory.yml

View File

@@ -1,12 +1,21 @@
{{ minecraft_server_dir }}/logs/*.log {
{{ minecraft_base_dir }}/logs/*.log {
daily
missingok
rotate 52
rotate 30
compress
delaycompress
notifempty
create 644 {{ minecraft_user }} {{ minecraft_group }}
postrotate
systemctl reload minecraft
endscript
copytruncate
su {{ minecraft_user }} {{ minecraft_group }}
}
{{ minecraft_server_dir }}/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
su {{ minecraft_user }} {{ minecraft_group }}
}

View File

@@ -7,11 +7,12 @@ Type=forking
User={{ minecraft_user }}
Group={{ minecraft_group }}
WorkingDirectory={{ minecraft_server_dir }}
ExecStart=/usr/bin/java -Xms{{ minecraft_memory_min }} -Xmx{{ minecraft_memory_max }} -jar {{ minecraft_server_dir }}/spigot.jar nogui
ExecStop={{ minecraft_tools_dir }}/mcrcon -H 127.0.0.1 -P {{ minecraft_rcon_port }} -p {{ minecraft_rcon_password }} stop
RemainAfterExit=yes
RestartSec=15
Restart=always
ExecStart=/usr/bin/java -Xms{{ minecraft_memory_min }} -Xmx{{ minecraft_memory_max }} -jar spigot.jar nogui
ExecStop=/usr/local/bin/mcrcon -H 127.0.0.1 -P {{ rcon_port }} -p {{ rcon_password }} stop
TimeoutStartSec=600
TimeoutStopSec=600
Restart=on-failure
RestartSec=20
[Install]
WantedBy=multi-user.target

View File

@@ -1,10 +1,10 @@
[
{% for op in minecraft_ops | default([]) %}
{
"uuid": "{{ op.uuid }}",
"name": "{{ op.name }}",
"level": {{ op.level | default(4) }},
"bypassesPlayerLimit": {{ op.bypass_limit | default(false) | lower }}
}{% if not loop.last %},{% endif %}
{% for op in minecraft_ops %}
{
"uuid": "{{ op.uuid }}",
"name": "{{ op.name }}",
"level": {{ op.level | default(4) }},
"bypassesPlayerLimit": {{ op.bypass_player_limit | default(false) | ternary('true', 'false') }}
}{% if not loop.last %},{% endif %}
{% endfor %}
]

View File

@@ -1,24 +1,46 @@
#Minecraft server properties
server-name=Spigot Server
# Minecraft server properties
# Generated by Ansible
# Server settings
server-name={{ server_name }}
motd={{ server_motd }}
server-port={{ minecraft_port }}
max-players=20
gamemode=survival
difficulty=normal
max-players={{ max_players }}
# Game settings
gamemode={{ gamemode }}
difficulty={{ difficulty }}
pvp={{ pvp_enabled | ternary('true', 'false') }}
hardcore=false
white-list=false
enforce-whitelist=false
pvp=true
enable-command-block=false
spawn-protection=16
op-permission-level=4
allow-flight=false
enable-rcon=true
rcon.port={{ minecraft_rcon_port }}
rcon.password={{ minecraft_rcon_password }}
motd=Minecraft Spigot Server managed by Ansible
max-world-size=29999984
# RCON settings
enable-rcon={{ rcon_enabled | ternary('true', 'false') }}
rcon.port={{ rcon_port }}
rcon.password={{ rcon_password }}
# Network settings
server-ip=
online-mode=true
spawn-monsters=true
generate-structures=true
view-distance=10
level-seed=
white-list=false
enable-status=true
enable-query=false
query.port=25565
# World generation
level-name=world
level-type=default
level-seed=
level-type=minecraft\:normal
generate-structures=true
spawn-animals=true
spawn-monsters=true
spawn-npcs=true
# Performance settings
view-distance=10
simulation-distance=10
max-tick-time=60000
use-native-transport=true
enable-jmx-monitoring=false

View File

@@ -0,0 +1,21 @@
---
# Internal variables for Minecraft installation
required_packages:
- openjdk-17-jdk
- git
- build-essential
- screen
spigot_build_tools_url: "https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar"
mcrcon_repository: "https://github.com/Tiiffi/mcrcon.git"
# Default server configuration
default_server_properties:
server-port: 25565
max-players: 20
gamemode: survival
difficulty: normal
pvp: true
online-mode: true
white-list: false