diff --git a/ec2.yml b/ec2.yml index c7324c5..4d2a0b5 100644 --- a/ec2.yml +++ b/ec2.yml @@ -5,10 +5,19 @@ roles: - common - user +- hosts: tag_minecraft_botaniapack + vars: + mcname: "botaniapack-1" + mczip: "https://www.assburgers.club/files/botaniapack-1.zip" + mcforge: "1.10.2-12.18.3.2511" + mcport: "25565" + mcmotd: "First time on Assburgers edition" + roles: + - minecraft - hosts: tag_ansiblehost_true roles: - ansiblehost -- hosts: tag_role_nextcloud +- hosts: tag_www_true vars: mysql_root_password: !vault | $ANSIBLE_VAULT;1.1;AES256 diff --git a/roles/minecraft/files/eula.txt b/roles/minecraft/files/eula.txt new file mode 100644 index 0000000..9fa0066 --- /dev/null +++ b/roles/minecraft/files/eula.txt @@ -0,0 +1,2 @@ +# Yes, we accept the EULA +eula=true diff --git a/roles/minecraft/files/minecraft@.service b/roles/minecraft/files/minecraft@.service new file mode 100644 index 0000000..a6aa49c --- /dev/null +++ b/roles/minecraft/files/minecraft@.service @@ -0,0 +1,37 @@ +# +# Licensed under the terms of the MIT license +# Source: https://github.com/agowa338/MinecraftSystemdUnit/ +# vim:ft=dosini: +# + +[Unit] +Description=Minecraft Server %i +After=network.target + +[Service] +User=minecraft +Group=mc-admin +WorkingDirectory=/var/minecraft/%i +# Hide other users from unit +PrivateUsers=true +# Read only mapping of /usr /boot and /etc +ProtectSystem=full +ProtectHome=true +# Implies MountFlags=slave +ProtectKernelTunables=true +# Implies NoNewPrivileges=yes +ProtectKernelModules=true +# Implies MountAPIVFS=yes +ProtectControlGroups=true + +ExecStart=/bin/sh -c '/usr/bin/screen -DmS mc-%i /usr/bin/java -Xms512M -Xmx2048M -jar server.jar nogui' + +ExecReload=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "reload"\\015' + +ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Server is going down: Service was stopped"\\015' +ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "save-all"\\015' +ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "stop"\\015' +ExecStop=/bin/sleep 10 + +Restart=on-failure +RestartSec=60s diff --git a/roles/minecraft/meta/main.yml b/roles/minecraft/meta/main.yml new file mode 100644 index 0000000..a3b0acf --- /dev/null +++ b/roles/minecraft/meta/main.yml @@ -0,0 +1,2 @@ +--- +allow_duplicates: yes diff --git a/roles/minecraft/tasks/main.yml b/roles/minecraft/tasks/main.yml new file mode 100644 index 0000000..ea74827 --- /dev/null +++ b/roles/minecraft/tasks/main.yml @@ -0,0 +1,95 @@ +#!/usr/bin/ansible-playbook +# vim:ft=ansible: +--- +- name: Set up Minecraft user + block: + - name: Install required packages + apt: + name: "{{ packages }}" + vars: + packages: + - openjdk-8-jre + - screen + - unzip + - name: Assure minecraft admin group + group: + name: mc-admin + - name: Assure server user + user: + name: minecraft + group: mc-admin + system: yes + home: /var/minecraft + - name: Assure var directory + file: + path: /var/minecraft + state: directory + owner: root + group: mc-admin + # Sticky, SetGID + mode: "3770" + - name: Assure systemd unit + copy: + src: "minecraft@.service" + dest: "/etc/systemd/system/minecraft@.service" + - name: Reload available daemons + systemd: + daemon_reload: yes + become: yes +- name: Set up Minecraft server + block: + - name: Create server directory + file: + path: "/var/minecraft/{{ mcname }}" + state: directory + - name: Check for existing install + stat: + path: "/var/minecraft/{{ mcname }}/forge-{{ mcforge }}-universal.jar" + register: stat_mcroot_forgejar + - name: Unpack archive + block: + - name: Download zip + get_url: + dest: "/var/minecraft/{{ mcname }}/modpack.zip" + url: "{{ mczip }}" + - name: Unpack zip + unarchive: + src: "/var/minecraft/{{ mcname }}/modpack.zip" + remote_src: yes + dest: "/var/minecraft/{{ mcname }}" + - name: Remove zip + file: + path: "/var/minecraft/{{ mcname }}/modpack.zip" + state: absent + - name: Template out server.properties + template: + src: server.properties + dest: "/var/minecraft/{{ mcname }}/server.properties" + - name: Accept EULA + copy: + src: "eula.txt" + dest: "/var/minecraft/{{ mcname }}/eula.txt" + - name: Download Forge + get_url: + dest: "/var/minecraft/{{ mcname }}/installer.jar" + # Accurate as of 2020-02-23 + url: "https://files.minecraftforge.net/maven/net/minecraftforge/forge/{{ mcforge }}/forge-{{ mcforge }}-installer.jar" + - name: Install Forge + # Note: This also installs a Minecraft server, thankfully + command: + chdir: "/var/minecraft/{{ mcname }}" + argv: + - /usr/bin/java + - "-jar" + - "/var/minecraft/{{ mcname }}/installer.jar" + - "--installServer" + args: + creates: "/var/minecraft/{{ mcname }}/forge-{{ mcforge }}-universal.jar" + - name: Link server jar + file: + path: "/var/minecraft/{{ mcname }}/server.jar" + src: "/var/minecraft/{{ mcname }}/forge-{{ mcforge }}-universal.jar" + state: link + when: not stat_mcroot_forgejar.stat.exists + become: yes + become_user: minecraft diff --git a/roles/minecraft/templates/server.properties b/roles/minecraft/templates/server.properties new file mode 100644 index 0000000..8fca14c --- /dev/null +++ b/roles/minecraft/templates/server.properties @@ -0,0 +1,40 @@ +#Minecraft server properties +#Fri Aug 23 01:44:29 UTC 2019 +spawn-protection=0 +max-tick-time=60000 +generator-settings= +force-gamemode=false +allow-nether=true +gamemode=0 +broadcast-console-to-ops=true +enable-query=false +player-idle-timeout=0 +difficulty=3 +spawn-monsters=true +op-permission-level=4 +pvp=true +snooper-enabled=false +level-type=default +hardcore=false +enable-command-block=true +max-players=8 +network-compression-threshold=256 +resource-pack-sha1= +max-world-size=29999984 +server-port={{ mcport }} +server-ip= +spawn-npcs=true +allow-flight=true +level-name=world +view-distance=12 +resource-pack= +spawn-animals=true +white-list=false +generate-structures=true +online-mode=true +max-build-height=256 +level-seed= +prevent-proxy-connections=false +use-native-transport=true +enable-rcon=false +motd={{ mcmotd }}