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).

