Portfolio/Projets/Ansible + Minecraft
DevOps · Automatisation · Virtualisation

Déploiement automatique
de serveur
Minecraft via Ansible

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.

BTS SIO 2025 — Épreuve E6
Ansible · Proxmox · Linux
Fonctionnel
Contexte

Pourquoi
ce projet ?

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.

Objectif
Déploiement automatisé en 1 commande
Outil d'automatisation
Ansible (playbooks YAML)
Virtualisation
Proxmox — Conteneurs Debian 12
Cadre
BTS SIO SISR — Épreuve E6
Technologies

Stack
utilisée

Proxmox

Plateforme de virtualisation pour créer et gérer les conteneurs LXC Debian 12.

Ansible

Outil d'automatisation sans agent. Pilote les machines via SSH avec des playbooks YAML.

Linux (Debian 12)

OS des conteneurs cibles. Environnement léger et stable pour héberger le serveur.

Minecraft Server

Service déployé automatiquement via l'API Mojang. Tournant sous Java 21.

Infrastructure

Architecture
du projet

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.

Schéma d'architecture
Hôte Proxmox Hyperviseur principal
↓ crée & gère
CT Ansible Serveur maître (Debian 12)
↓ SSH + playbooks
CT cible Debian 12 — Serveur Minecraft
↓ écoute sur
Port 25565 (TCP — Minecraft)
Mise en œuvre

Déroulement
du projet

01

Déploiement de l'infrastructure Proxmox

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

ProxmoxLXCDebian 12
02

Installation et configuration d'Ansible

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.

AnsibleOpenSSHClé SSHapt
03

Création du playbook — Conteneur Debian 12

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.

YAMLProxmox APIPlaybook
04

Création du playbook — Serveur Minecraft

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.

Java 21API MojangEULAUtilisateur dédié
05

Tests et validation

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.

TestsValidationConnexion Minecraft
Code

Les deux
playbooks

create-debian12.yml
Création du conteneur

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.

  • Connexion à l'API Proxmox
  • Création du conteneur LXC Debian 12
  • Attribution CPU, RAM, disque
  • Configuration réseau (IP / Gateway)
  • Démarrage automatique du conteneur
install-minecraft.yml
Installation du serveur

Installe et configure entièrement le serveur Minecraft sur le conteneur cible. Aucune intervention manuelle requise après lancement.

  • Mise à jour du système (apt update/upgrade)
  • Installation des dépendances (wget, curl…)
  • Installation de Java 21 (JDK)
  • Création de l'utilisateur dédié minecraft
  • Téléchargement du server.jar via API Mojang
  • Acceptation automatique de l'EULA
  • Lancement du serveur Minecraft
Source code

Code
source YAML

create-debian12.yml
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 }}"
deploy-minecraft.yml
- 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 }}"
Validation

Résultats
obtenus

Serveur Minecraft fonctionnel
Connexion validée via l'adresse IP du conteneur
✓ OK
Déploiement en 1 commande
ansible-playbook suffit à tout déployer
✓ OK
Zéro intervention manuelle
Aucun réglage post-déploiement nécessaire
✓ OK
Reproductible à l'infini
Même résultat garanti à chaque exécution
✓ OK
Perspectives

Améliorations
envisagées

Système de sauvegarde automatique des données du serveur
Supervision du serveur (monitoring, alertes)
Déploiement de plusieurs serveurs Minecraft en parallèle
Système de mise à jour automatique via l'API Mojang
Bilan

Compétences
mobilisées

Ansible Playbooks YAML Virtualisation Proxmox Conteneurs LXC Administration Linux SSH & clés publiques Java / JDK 21 Infrastructure as Code API REST (Mojang / Proxmox) Automatisation

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.

Retour au portfolio Voir le projet VPN