← Retour aux projetsÉtude de cas / Automatisation & IaC

Automatiser Proxmox avec Terraform et Ansible

Déclarer un conteneur LXC dans Terraform, le laisser découvrir par l’inventaire dynamique Ansible, puis appliquer un rôle Wazuh sans ajouter la machine à la main dans un fichier d’inventaire.

Environnement
Proxmox VE 9.0 · LXC Debian 13
Périmètre
Création du LXC, inventaire dynamique, rôle Wazuh
Statut
Laboratoire documenté
Documentation
25 pages · PDF

Contexte et objectif

Le laboratoire part d’un constat simple : créer chaque conteneur depuis l’interface Proxmox et maintenir un inventaire Ansible statique devient vite difficile à reproduire. L’objectif est de décrire l’infrastructure dans du code, puis de laisser Ansible découvrir la machine et appliquer sa configuration.

La documentation couvre la chaîne complète, de l’installation de Terraform à l’exécution du playbook Wazuh, avec les erreurs réellement rencontrées pendant le montage.

Architecture

Terraform crée et maintient le conteneur LXC via l’API Proxmox. Proxmox héberge le conteneur, son disque, son réseau et ses métadonnées, notamment les tags. L’inventaire dynamique interroge ensuite l’API, transforme les informations du conteneur en hôte Ansible et utilise les tags pour construire les groupes. Ansible se connecte enfin en SSH pour appliquer le rôle.

  • Terraform : déclaration du provider bpg/proxmox et de la ressource LXC.
  • Proxmox VE 9.0 : template Debian 13, bridge vmbr1 en 10.10.10.1/24, conteneur debian-tf-01 en 10.10.10.5/24, VMID 200.
  • Inventaire dynamique : plugin community.proxmox, filtrage et regroupement à partir des tags terraform et wazuh_clients.
  • Ansible : connexion SSH avec une clé dédiée et application du playbook wazuh-agent.yml.

Technologies

TerraformHCLbpg/proxmoxProxmox VE 9Debian 13Ansiblecommunity.proxmoxansible.utilsWazuh AgentSSH

Réalisation technique

  1. Installer Terraform sur Debian et créer un projet HCL dédié.
  2. Créer un compte et un token API dans Proxmox, puis tester l’authentification avec une data source avant de créer la moindre ressource.
  3. Préparer le template LXC Debian 13 et vérifier que le bridge vmbr1 est réellement actif dans le noyau.
  4. Déclarer le conteneur dans Terraform : hostname, réseau, DNS, tags et clé SSH publique injectée à la création.
  5. Lire le plan Terraform, appliquer la configuration et vérifier l’état du conteneur avec pct et terraform state.
  6. Configurer l’inventaire dynamique Proxmox avec filtrage par tag, groupes et composition de ansible_host.
  7. Valider la découverte avec ansible-inventory --graph, puis tester la connexion avec le module ping.
  8. Appliquer le playbook Wazuh uniquement au conteneur de test avec --limit, avant toute généralisation.

Difficultés rencontrées

Difficultés rencontrées, causes et corrections
SymptômeCauseCorrection
Missing name for resourceLe bloc resource ne portait qu’un seul label.Ajouter le nom local : resource "proxmox_virtual_environment_container" "debian_test".
Invalid block definitionLe signe = manquait sur une affectation HCL.Écrire node_name = "..." et hostname = "..." au lieu de séparer le nom et la valeur.
Template LXC introuvableFaute de frappe dans le nom du template (standad au lieu de standard).Relire pveam list local et recopier exactement le volume affiché.
bridge vmbr1 does not existLe bridge existait dans la configuration Proxmox mais n’était pas actif dans le réseau Linux.Vérifier Autostart et le CIDR, appliquer la configuration, puis contrôler avec ip -br link.
Avertissement Systemd 257Debian 13 utilise un systemd récent dans un conteneur non privilégié.Activer features { nesting = true } dans la ressource Terraform.
ansible_host absentLe filtre ipaddr n’était pas disponible correctement dans l’environnement Ansible.Installer ansible.utils et python3-netaddr, puis utiliser ansible.utils.ipaddr dans compose.
Secret du token APILe secret ne doit pas être écrit dans main.tf ou dans l’inventaire.Fournir le token via des variables d’environnement et un fichier de variables non versionné.

Résultats

  • Terraform a créé le conteneur LXC et Proxmox a exposé ses informations via l’API.
  • L’inventaire dynamique a découvert debian-tf-01, son adresse 10.10.10.5 et les groupes construits à partir des tags.
  • Le test Ansible a répondu pong, confirmant la découverte de l’hôte et la connexion SSH.
  • Le playbook Wazuh s’est terminé avec ok=8, changed=6, unreachable=0 et failed=0.
  • L’inventaire statique existant peut rester en place et être chargé en même temps que la source dynamique.

Limites et points de vigilance

  • Le montage est un laboratoire : la documentation ne décrit pas un déploiement en production.
  • Le même token API a été réutilisé pour Terraform et Ansible dans le cadre du lab ; la documentation recommande un token distinct avec des droits de lecture adaptés.
  • La vérification TLS du provider est désactivée dans le laboratoire.

Documentation complète

Documentation source : Terraform + Proxmox VE 9 + Ansible, 28 août 2026, 25 pages. Le PDF contient les commandes, les fichiers de configuration et les captures du montage.