Automatisation complète du déploiement d'un serveur Minecraft sur un conteneur Proxmox Debian 12 grâce à 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 humaines.
L'objectif de ce projet 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 manière 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.
Plateforme de virtualisation pour créer et gérer les conteneurs LXC Debian 12.
Outil d'automatisation sans agent. Pilote les machines via SSH avec des playbooks YAML.
OS des conteneurs cibles. Environnement léger et stable pour héberger le serveur.
Service déployé automatiquement via l'API Mojang. Tournant sous Java 21.
L'architecture repose sur un serveur Ansible maître hébergé dans un premier conteneur Proxmox. Ce serveur pilote à distance les conteneurs cibles via une connexion SSH sans mot de passe (clé publique).
Les playbooks définissent l'état souhaité de chaque machine : le premier crée le conteneur Debian 12, le second y installe et configure le serveur Minecraft de A à Z.
Le déploiement est entièrement reproductible : relancer les playbooks produit exactement le même résultat, sans intervention manuelle.
Création du conteneur maître sur Proxmox (Debian 12), configuration du réseau (IP fixe ou DHCP, gateway, DNS), allocation des ressources (CPU, RAM, disque).
Mise à jour du système, installation d'Ansible et d'OpenSSH. Génération d'une paire de clés SSH et copie de la clé publique sur les machines cibles pour une connexion sans mot de passe.
Rédaction du fichier create-debian12.yml permettant à Ansible de créer automatiquement un conteneur sur Proxmox, lui attribuer des ressources et le démarrer. Exécution via ansible-playbook.
Rédaction du playbook d'installation complet : mise à jour système, installation des dépendances, installation de Java 21, création d'un utilisateur dédié minecraft, téléchargement du serveur via l'API Mojang, acceptation de l'EULA, lancement automatique.
Vérification de l'exécution complète des playbooks sans erreur. Connexion au serveur Minecraft depuis un client via l'adresse IP du conteneur. Validation de la reproductibilité du déploiement.
Automatise la création d'un conteneur LXC Debian 12 sur Proxmox via l'API. Configure les ressources et le réseau, puis démarre la machine.
Installe et configure entièrement le serveur Minecraft sur le conteneur cible. Aucune intervention manuelle requise après lancement.
name: Deploiement CT Minecraft automatique
hosts: localhost
gather_facts: no
vars:
proxmox_host: "X.X.X.X"
node: "pve-XX"
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
set_fact:
vmid: "{{ nextid.json.data }}"
- name: Definir le nom du conteneur
set_fact:
container_name: "CT-minecraft-{{ vmid }}"
- 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: "**********"
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: "X.X.X.X"
node: "pve-XX"
api_user: "root@pam"
api_token_id: "ansibe"
api_token_secret: "********************"
ip_range_start: 2
ip_range_end: 9
network_prefix: "10.1.0"
gateway: "X.X.X.X"
storage: "rpool-data"
template: "local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst"
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
swap: 512
storage: "{{ storage }}"
pubkey: "{{ ssh_public_key }}"
netif:
net0: "name=eth0,bridge=vmbr0,ip={{ selected_ip }}/24,gw=X.X.X.X"
state: present
- name: Demarrer le conteneur
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: Attendre que SSH soit disponible
wait_for:
host: "{{ selected_ip }}"
port: 22
timeout: 120
- 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
- name: Installation automatique Minecraft Vanilla
hosts: minecraft_ct
become: false
vars:
minecraft_dir: /opt/minecraft
minecraft_user: minecraft
minecraft_url: "https://piston-data.mojang.com/v1/objects/..."
tasks:
- name: Mettre a jour les paquets
apt:
update_cache: yes
- name: Installer dependances
apt:
name:
- wget
- screen
- nano
state: present
- name: Telecharger Java 21
get_url:
url: https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.deb
dest: /tmp/jdk21.deb
- name: Installer Java
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: Recuperer manifest Minecraft
uri:
url: https://launchermeta.mojang.com/mc/game/version_manifest.json
return_content: yes
register: mc_manifest
- name: Extraire derniere version
set_fact:
mc_latest: "{{ mc_manifest.json.latest.release }}"
- name: Telecharger serveur Minecraft Vanilla
get_url:
url: "{{ mc_version_data.json.downloads.server.url }}"
dest: "{{ minecraft_dir }}/server.jar"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
- name: Accepter l'EULA
copy:
content: "eula=true"
dest: "{{ minecraft_dir }}/eula.txt"
owner: "{{ minecraft_user }}"
- name: Lancer le serveur Minecraft
shell: "screen -dmS minecraft java -Xmx1024M -Xms1024M -jar {{ minecraft_dir }}/server.jar nogui"
become_user: "{{ minecraft_user }}"
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 et orchestration, j'ai pu déployer une solution concrète, reproductible et fonctionnelle — directement transposable à un contexte professionnel.