Automatisation complète du déploiement d'un serveur Minecraft 1.21.4 sur un conteneur Proxmox Debian 12 via des playbooks Ansible — en une seule commande.
Installer un serveur Minecraft manuellement demande de nombreuses étapes : installation de Java, configuration du système, création d'un utilisateur dédié, téléchargement du serveur, acceptation de la licence… Un processus long et sujet aux erreurs.
L'objectif est de rendre ce déploiement entièrement automatique. Grâce à Ansible et Proxmox, un serveur Minecraft complet est prêt à fonctionner en une seule commande, de façon reproductible et fiable.
Ce projet illustre concrètement les pratiques modernes d'Infrastructure as Code et d'orchestration, directement en lien avec les compétences SISR.
Hyperviseur pour créer et gérer les conteneurs LXC Debian 12 via API REST.
Automatisation sans agent via SSH. Playbooks YAML décrivant l'état cible.
OS des conteneurs cibles. Environnement léger et stable pour le serveur.
Serveur Vanilla déployé automatiquement sous Java 21 via playbook.
L'architecture repose sur un serveur Ansible maître hébergé dans un conteneur Proxmox dédié. Ce serveur pilote les conteneurs cibles via SSH sans mot de passe (clé publique).
Le premier playbook appelle l'API REST de Proxmox pour créer automatiquement le conteneur Debian 12 : attribution du VMID, configuration réseau, démarrage.
Le second playbook se connecte en SSH au conteneur créé et installe tout : mise à jour système, DNS, Java 21, utilisateur dédié, serveur Minecraft et lancement du service.
Le déploiement est entièrement reproductible : relancer les playbooks produit exactement le même résultat, sans aucune intervention manuelle.
Création du conteneur maître sur Proxmox (Debian 12), configuration du réseau, allocation des ressources (CPU, RAM, disque). Installation d'Ansible et OpenSSH.
Génération d'une paire de clés SSH (ssh-keygen) et copie de la clé publique sur les machines cibles pour permettre la connexion Ansible sans authentification par mot de passe.
Rédaction du fichier create-debian12.yml : appel à l'API REST de Proxmox pour créer automatiquement un conteneur, lui attribuer ses ressources et le démarrer.
Rédaction du playbook complet deploy-minecraft.yml : DNS, mise à jour système, Java 21 (JDK Oracle), utilisateur dédié, téléchargement du server.jar Minecraft 1.21.4, acceptation EULA, lancement.
Résolution des erreurs rencontrées : clé SSH tronquée dans le playbook, version de Java incompatible (Minecraft 1.21.5 → 1.21.4), DNS absent dans le conteneur, problème sudo avec l'utilisateur minecraft.
Exécution complète des playbooks sans erreur. Connexion validée au serveur Minecraft depuis un client via l'adresse IP du conteneur sur le port 25565.
Crée automatiquement un conteneur LXC Debian 12 sur Proxmox via l'API REST. Configure les ressources et démarre la machine.
Installe et configure entièrement le serveur Minecraft 1.21.4. Aucune intervention manuelle requise après lancement.
---
- name: Deploiement CT Minecraft automatique
hosts: localhost
gather_facts: no
vars:
proxmox_host: "10.1.0.253"
node: "pve-01"
template: "local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst"
api_token: "root@pam!ansibe=********************"
tasks:
- name: Recuperer le prochain VMID
uri:
url: "https://{{ proxmox_host }}:8006/api2/json/cluster/nextid"
method: GET
headers:
Authorization: "PVEAPIToken={{ api_token }}"
validate_certs: no
register: nextid
- name: Definir le VMID et le nom
set_fact:
vmid: "{{ nextid.json.data }}"
container_name: "CT-Debian12-{{ nextid.json.data }}"
- name: Creer le conteneur
uri:
url: "https://{{ proxmox_host }}:8006/api2/json/nodes/{{ node }}/lxc"
method: POST
headers:
Authorization: "PVEAPIToken={{ api_token }}"
body_format: form-urlencoded
body:
vmid: "{{ vmid }}"
hostname: "{{ container_name }}"
ostemplate: "{{ template }}"
cores: 2
memory: 2048
swap: 512
rootfs: "rpool-data:10"
net0: "name=eth0,bridge=vmbr0,ip=dhcp"
password: "Root!"
validate_certs: no
- name: Demarrer le conteneur
uri:
url: "https://{{ proxmox_host }}:8006/api2/json/nodes/{{ node }}/lxc/{{ vmid }}/status/start"
method: POST
headers:
Authorization: "PVEAPIToken={{ api_token }}"
validate_certs: no
- name: Afficher les infos
debug:
msg:
- "Conteneur cree : {{ container_name }}"
- "VMID : {{ vmid }}"
---
- name: Provisionnement du CT Minecraft
hosts: localhost
gather_facts: no
collections:
- community.general
vars:
proxmox_host: "10.1.0.253"
node: "pve-01"
api_token_id: "root@pam!ansibe"
api_token_secret: "********************"
ip_range_start: 2
ip_range_end: 9
network_prefix: "10.1.0"
storage: "rpool-data"
template: "local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst"
ssh_public_key: "ssh-rsa AAAA... root@ansible-gael"
tasks:
- name: Trouver une IP libre dans la plage
wait_for:
host: "{{ network_prefix }}.{{ item }}"
port: 22
timeout: 1
state: stopped
loop: "{{ range(ip_range_start, ip_range_end + 1) | list }}"
register: ip_scan
ignore_errors: yes
- name: Selectionner premiere IP libre
set_fact:
selected_ip: "{{ network_prefix }}.{{ item.item }}"
loop: "{{ ip_scan.results }}"
when: not item.failed
run_once: true
- name: Creer le conteneur via community.general.proxmox
community.general.proxmox:
api_host: "{{ proxmox_host }}"
api_user: "root@pam"
api_token_id: "ansibe"
api_token_secret: "{{ api_token_secret }}"
node: "{{ node }}"
vmid: "{{ vmid }}"
hostname: "{{ ct_name }}"
ostemplate: "{{ template }}"
cores: 2
memory: 2048
storage: "{{ storage }}"
pubkey: "{{ ssh_public_key }}"
netif:
net0: "name=eth0,bridge=vmbr0,ip={{ selected_ip }}/24,gw=10.1.0.254"
state: present
- name: Demarrer et attendre SSH
community.general.proxmox:
api_host: "{{ proxmox_host }}"
api_user: "root@pam"
api_token_id: "ansibe"
api_token_secret: "{{ api_token_secret }}"
node: "{{ node }}"
vmid: "{{ vmid }}"
state: started
- name: Ajouter le CT dans l'inventory dynamique
add_host:
name: minecraft_ct
ansible_host: "{{ selected_ip }}"
ansible_user: root
ansible_ssh_private_key_file: /root/.ssh/id_rsa
ansible_ssh_extra_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
- name: Installation automatique Minecraft Vanilla
hosts: minecraft_ct
become: false
vars:
minecraft_dir: /opt/minecraft
minecraft_user: minecraft
tasks:
- name: Configurer le DNS
copy:
dest: /etc/resolv.conf
content: "nameserver 8.8.8.8\nnameserver 8.8.4.4"
- name: Mettre a jour les paquets
apt:
update_cache: yes
- name: Installer dependances
apt:
name: [ wget, screen, nano ]
state: present
- name: Telecharger Java 21 (JDK Oracle)
get_url:
url: https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.deb
dest: /tmp/jdk21.deb
- name: Installer Java 21
apt:
deb: /tmp/jdk21.deb
- name: Creer utilisateur minecraft
user:
name: "{{ minecraft_user }}"
system: yes
create_home: yes
shell: /bin/bash
- name: Creer dossier Minecraft
file:
path: "{{ minecraft_dir }}"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: '0755'
- name: Telecharger serveur Minecraft 1.21.4
get_url:
url: "https://piston-data.mojang.com/v1/objects/4707d00eb834b446575d89a61a11b5d548d8c001/server.jar"
dest: "{{ minecraft_dir }}/server.jar"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
- name: Accepter l'EULA
copy:
dest: "{{ minecraft_dir }}/eula.txt"
content: "eula=true"
owner: "{{ minecraft_user }}"
- name: Lancer le serveur Minecraft
shell: |
su - {{ minecraft_user }} -c "screen -dmS minecraft bash -c 'cd {{ minecraft_dir }} && java -Xms1024M -Xmx1024M -jar server.jar nogui'"
- name: Afficher l'adresse du serveur
debug:
msg: "Serveur Minecraft disponible : {{ ansible_host }}:25565"
Ce projet m'a permis de mettre en pratique des compétences essentielles en administration système et en automatisation d'infrastructures. En combinant virtualisation Proxmox et orchestration Ansible, j'ai pu déployer une solution concrète, reproductible et fonctionnelle, directement transposable à un contexte professionnel.