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 1.21.4 sur un conteneur Proxmox Debian 12 via des playbooks Ansible — en une seule commande.

BTS SIO 2025 — Épreuve E6
Ansible · Proxmox · Linux · Java 21
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.

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.

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

Stack
utilisée

Proxmox

Hyperviseur pour créer et gérer les conteneurs LXC Debian 12 via API REST.

Ansible

Automatisation sans agent via SSH. Playbooks YAML décrivant l'état cible.

Debian 12

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

Minecraft 1.21.4

Serveur Vanilla déployé automatiquement sous Java 21 via playbook.

Architecture

Schéma de
déploiement

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.

Flux de déploiement Ansible
PROXMOX HOST — pve-01 CT Ansible Serveur maître Debian 12 Playbooks YAML API Proxmox REST HTTPS Port 8006 Token Auth ① API REST CT Debian 12 — cible IP : 10.1.0.X (DHCP) SSH actif Créé automatiquement ② Crée le CT ③ SSH + playbook Serveur Minecraft Version 1.21.4 Java 21 — Port 25565 Prêt à jouer ! ④ Installe Minecraft Appel API REST Connexion SSH
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, allocation des ressources (CPU, RAM, disque). Installation d'Ansible et OpenSSH.

ProxmoxLXCDebian 12Ansible
02

Configuration SSH sans mot de passe

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.

SSHClé publiquessh-keygenssh-copy-id
03

Playbook — Création du conteneur Debian 12

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.

YAMLAPI ProxmoxURI moduleToken Auth
04

Playbook — Installation automatique Minecraft

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.

Java 21Minecraft 1.21.4EULAUtilisateur dédiéDNS 8.8.8.8
05

Corrections et résolution des problèmes

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.

DebuggingKnown_hostsStrictHostKeyCheckingFloating Rule
06

Tests et validation

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.

TestsPort 25565Connexion MinecraftReproductibilité
Code

Les deux
playbooks

create-debian12.yml
Création du conteneur

Crée automatiquement un conteneur LXC Debian 12 sur Proxmox via l'API REST. Configure les ressources et démarre la machine.

  • Appel API Proxmox — récupère le prochain VMID
  • Définit le nom du conteneur (CT-Debian12-VMID)
  • Crée le conteneur LXC avec CPU, RAM, disque
  • Configure le réseau (DHCP — vmbr0)
  • Démarre automatiquement le conteneur
deploy-minecraft.yml
Installation du serveur

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

  • Configure le DNS (8.8.8.8 / 8.8.4.4)
  • Mise à jour système (apt update/upgrade)
  • Installation Java 21 JDK Oracle
  • Création utilisateur dédié minecraft
  • Téléchargement server.jar v1.21.4
  • Acceptation automatique de l'EULA
  • Lancement du serveur via screen
Source code

Code
source YAML

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

Résultats
obtenus

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

Améliorations
envisagées

Sauvegarde automatique des données du serveur
Supervision du serveur avec Netdata ou Zabbix
Déploiement de plusieurs serveurs en parallèle
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 21 / JDK Infrastructure as Code API REST Proxmox Automatisation Debugging YAML

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.

Retour au portfolio Voir le projet VPN