Servidores de Jogos

Ansible: automatize o setup de servidores Minecraft (playbook pronto)

Por que Ansible

Você monta 3 servidores MC por mês. Sempre os mesmos passos:

  • Criar user, instalar Java
  • Baixar Paper, aceitar EULA
  • Setup systemd + start
  • Config firewall, backup

Manual leva 30-60 min. Ansible faz em 3 min.

Ansible é agentless — só precisa SSH. Roda do seu laptop, provisiona a VPS remota.

Requisitos

  • Sua máquina: Ansible instalado (apt install ansible)
  • VPS destino: Ubuntu 22.04+ com SSH e sudo
  • Chave SSH configurada (não use senha)

Estrutura do projeto

mc-ansible/
├── inventory.ini
├── playbook.yml
├── group_vars/
│   └── mc_servers.yml
└── roles/
    └── minecraft/
        ├── tasks/main.yml
        ├── templates/
        │   ├── server.properties.j2
        │   ├── minecraft.service.j2
        │   └── backup.sh.j2
        └── handlers/main.yml

Inventory (inventory.ini)

[mc_servers]
mc01 ansible_host=189.10.20.30 ansible_user=root

[mc_servers:vars]
mc_version=1.21.4
mc_ram_gb=4
mc_max_players=30
mc_motd="§6Vitt Host §fServer"

Playbook (playbook.yml)

---
- name: Provisionar servidor Minecraft Paper
  hosts: mc_servers
  become: true
  roles:
    - minecraft

Role principal (roles/minecraft/tasks/main.yml)

---
- name: Instalar deps
  apt:
    name: [openjdk-21-jre-headless, screen, wget, curl, jq, ufw]
    update_cache: true
    state: present

- name: Criar user minecraft
  user:
    name: minecraft
    shell: /bin/bash
    home: /opt/minecraft
    system: true

- name: Criar diretórios
  file:
    path: "{{ item }}"
    state: directory
    owner: minecraft
    group: minecraft
    mode: '0755'
  loop:
    - /opt/minecraft
    - /opt/minecraft/plugins
    - /var/backup/mc

- name: Buscar última build Paper
  uri:
    url: "https://api.papermc.io/v2/projects/paper/versions/{{ mc_version }}"
    return_content: yes
  register: paper_versions

- name: Setar build number
  set_fact:
    paper_build: "{{ (paper_versions.content | from_json).builds[-1] }}"

- name: Baixar Paper .jar
  get_url:
    url: "https://api.papermc.io/v2/projects/paper/versions/{{ mc_version }}/builds/{{ paper_build }}/downloads/paper-{{ mc_version }}-{{ paper_build }}.jar"
    dest: /opt/minecraft/server.jar
    owner: minecraft
    group: minecraft
    mode: '0644'
  notify: restart minecraft

- name: Aceitar EULA
  copy:
    content: "eula=true
"
    dest: /opt/minecraft/eula.txt
    owner: minecraft
    group: minecraft

- name: Config server.properties
  template:
    src: server.properties.j2
    dest: /opt/minecraft/server.properties
    owner: minecraft
    group: minecraft
    mode: '0644'
  notify: restart minecraft

- name: Instalar systemd unit
  template:
    src: minecraft.service.j2
    dest: /etc/systemd/system/minecraft.service
    mode: '0644'
  notify:
    - daemon reload
    - restart minecraft

- name: Script de backup
  template:
    src: backup.sh.j2
    dest: /usr/local/bin/mc-backup.sh
    mode: '0755'

- name: Cron backup diário 04h
  cron:
    name: MC backup diario
    hour: "4"
    minute: "0"
    job: /usr/local/bin/mc-backup.sh
    user: root

- name: Firewall — MC porta 25565
  ufw:
    rule: allow
    port: "25565"
    proto: tcp

- name: Firewall — SSH
  ufw:
    rule: allow
    port: "22"
    proto: tcp

- name: UFW enable
  ufw:
    state: enabled

- name: Habilitar minecraft.service
  systemd:
    name: minecraft
    enabled: true
    state: started

Handlers (roles/minecraft/handlers/main.yml)

---
- name: daemon reload
  systemd:
    daemon_reload: true

- name: restart minecraft
  systemd:
    name: minecraft
    state: restarted

Templates

templates/server.properties.j2:

motd={{ mc_motd }}
max-players={{ mc_max_players }}
online-mode=true
view-distance=8
simulation-distance=6
enable-command-block=true
enforce-secure-profile=false

templates/minecraft.service.j2:

[Unit]
Description=Minecraft Paper Server
After=network.target

[Service]
Type=simple
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms{{ mc_ram_gb }}G -Xmx{{ mc_ram_gb }}G 
  -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 
  -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch 
  -jar server.jar nogui
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

templates/backup.sh.j2:

#!/bin/bash
DATE=$(date +%F)
cd /opt/minecraft
systemctl stop minecraft
sleep 5
tar czf /var/backup/mc/mc-$DATE.tar.gz world plugins server.properties
systemctl start minecraft
find /var/backup/mc -name "mc-*" -mtime +14 -delete

Executar

ansible-playbook -i inventory.ini playbook.yml

Em 3-5 minutos: VPS pronta, Paper rodando, systemd ativo, firewall, backup.

Provisionar 10 servidores de uma vez

Adicione ao inventory.ini:

[mc_servers]
mc01 ansible_host=189.10.20.30
mc02 ansible_host=189.10.20.31
mc03 ansible_host=189.10.20.32
# ...

Ansible provisiona em paralelo (5 hosts default, configurável).

Update de Paper via Ansible

ansible-playbook -i inventory.ini playbook.yml --tags "download"

Variações úteis

Diferente RAM por servidor

# group_vars/mc_servers.yml
mc_ram_gb: 4

# host_vars/mc01.yml (override)
mc_ram_gb: 8

Deploy com plugins

Adicione tasks:

- name: Baixar LuckPerms
  get_url:
    url: "https://luckperms.net/download"
    dest: /opt/minecraft/plugins/LuckPerms.jar

Rollback

ansible-playbook -i inventory.ini rollback.yml

Vale a pena?

Sim, se você:

  • Gerencia > 3 servers
  • Cria/derruba servers com frequência
  • Vende hosting como serviço

Não, se você:

  • Tem 1 servidor único (setup manual é ok)

Links

Nossos VPS-BR são compatíveis com qualquer playbook Ansible (Ubuntu 22.04 padrão).

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS
⏰ 20% OFF em VPS-BR --:--:-- Ver oferta →