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.
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
Réalisation technique
- Installer Terraform sur Debian et créer un projet HCL dédié.
- 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.
- Préparer le template LXC Debian 13 et vérifier que le bridge vmbr1 est réellement actif dans le noyau.
- Déclarer le conteneur dans Terraform : hostname, réseau, DNS, tags et clé SSH publique injectée à la création.
- Lire le plan Terraform, appliquer la configuration et vérifier l’état du conteneur avec pct et terraform state.
- Configurer l’inventaire dynamique Proxmox avec filtrage par tag, groupes et composition de ansible_host.
- Valider la découverte avec ansible-inventory --graph, puis tester la connexion avec le module ping.
- Appliquer le playbook Wazuh uniquement au conteneur de test avec --limit, avant toute généralisation.
Difficultés rencontrées
| Symptôme | Cause | Correction |
|---|---|---|
| Missing name for resource | Le bloc resource ne portait qu’un seul label. | Ajouter le nom local : resource "proxmox_virtual_environment_container" "debian_test". |
| Invalid block definition | Le signe = manquait sur une affectation HCL. | Écrire node_name = "..." et hostname = "..." au lieu de séparer le nom et la valeur. |
| Template LXC introuvable | Faute 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 exist | Le 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 257 | Debian 13 utilise un systemd récent dans un conteneur non privilégié. | Activer features { nesting = true } dans la ressource Terraform. |
| ansible_host absent | Le 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 API | Le 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.