
Pour un homelab ou une PME sous Proxmox VE, le plugin community.general.proxmox est la solution la plus complète. Contrairement à libvirt qui ne retourne que les noms de VMs, le plugin Proxmox récupère les VMs, les conteneurs LXC, leurs IPs (via l’agent QEMU), leurs tags Proxmox — tout en une seule API call.
Cette page est didactique — elle suppose un cluster Proxmox déjà déployé.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Configurer le plugin avec un token API Proxmox (sans password).
- Lister VMs et conteneurs LXC dans un même inventaire.
- Récupérer les IPs automatiquement via l’agent QEMU.
- Grouper par tag Proxmox, par node Proxmox, par état.
- Anticiper les pièges (agent QEMU absent, tokens permissions).
Prérequis
Section intitulée « Prérequis »- Un cluster ou serveur Proxmox VE 7+ opérationnel.
- Token API Proxmox créé (procédure ci-dessous).
community.generalcollection installée.requestsPython côté control node :pip install requests.
Création d’un token API Proxmox
Section intitulée « Création d’un token API Proxmox »Plutôt qu’un mot de passe (renouvellement, MFA, audit), utiliser un token API dédié à Ansible.
Sur l’interface Proxmox web : Datacenter → Permissions → API Tokens → Add.
| Champ | Valeur |
|---|---|
| User | ansible@pve (créer ce user au préalable) |
| Token ID | inventory |
| Privilege Separation | Décocher (sinon il faut donner les rôles séparément) |
| Expire | Date d’expiration (recommandé : 1 an) |
À la création, Proxmox affiche le token secret une seule fois — copier immédiatement, vous ne pourrez plus le voir.
Permissions minimales requises : PVEAuditor (lecture seule sur tous les paths) — suffit pour l’inventaire dynamique.
Configuration minimale
Section intitulée « Configuration minimale »Créer inventory/proxmox.yml :
---plugin: community.general.proxmoxurl: https://proxmox.example.com:8006user: ansible@pvetoken_id: inventorytoken_secret: !vault | $ANSIBLE_VAULT;1.1;AES256 3736...validate_certs: trueLe token_secret doit être chiffré avec Ansible Vault :
ansible-vault encrypt_string '<le-secret-token>' --name token_secretColler le résultat dans le YAML. Le déchiffrement se fait au runtime avec --ask-vault-pass.
Inclure VMs et LXC
Section intitulée « Inclure VMs et LXC »Par défaut, le plugin ne liste que les VMs (KVM). Pour inclure aussi les conteneurs LXC :
plugin: community.general.proxmoxurl: https://proxmox.example.com:8006user: ansible@pvetoken_id: inventorytoken_secret: !vault | ...
want_facts: true # détails complets de chaque VM/LXCwant_proxmox_nodes_ansible_host: false # ne pas définir ansible_host depuis ProxmoxTester :
ansible-inventory -i inventory/proxmox.yml --graphSortie :
@all: |--@proxmox_lab: # le cluster Proxmox |--@proxmox_node_pve01: # un node du cluster | |--vm-100 | |--vm-101 |--@proxmox_running: # VMs en cours d'exécution | |--vm-100 |--@proxmox_lxc: # conteneurs LXC | |--ct-200Récupérer les IPs via l’agent QEMU
Section intitulée « Récupérer les IPs via l’agent QEMU »L’avantage majeur de Proxmox sur libvirt : si l’agent QEMU est installé sur les VMs, le plugin récupère leurs IPs automatiquement.
Sur chaque VM Proxmox :
# RHEL/Alma/Rockysudo dnf install -y qemu-guest-agentsudo systemctl enable --now qemu-guest-agent
# Debian/Ubuntusudo apt install -y qemu-guest-agentsudo systemctl enable --now qemu-guest-agentCôté Proxmox, activer l’agent dans la config de la VM (interface web : Hardware → QEMU Guest Agent → Enabled, ou en CLI qm set <VMID> --agent enabled=1).
Une fois ça en place :
ansible-inventory -i inventory/proxmox.yml --host vm-100 | grep -i ipVous voyez les IPs réelles de la VM (privée et publique si configurées).
Grouper par tags Proxmox
Section intitulée « Grouper par tags Proxmox »Proxmox 7+ supporte les tags sur chaque VM/LXC. Le plugin les utilise comme keyed_groups :
plugin: community.general.proxmoxurl: https://proxmox.example.com:8006user: ansible@pvetoken_id: inventorytoken_secret: !vault | ...
want_facts: true
keyed_groups: # Un groupe par tag Proxmox - prefix: tag key: proxmox_tags_parsed parent_group: lab_vmsSi une VM a les tags Proxmox prod;web, elle rejoint les groupes tag_prod et tag_web. Pratique pour grouper sans toucher à l’inventaire YAML.
Cache pour éviter les API calls répétés
Section intitulée « Cache pour éviter les API calls répétés »plugin: community.general.proxmoxurl: https://proxmox.example.com:8006user: ansible@pvetoken_id: inventorytoken_secret: !vault | ...
cache: truecache_plugin: jsonfilecache_timeout: 300cache_connection: /tmp/ansible_proxmox_cacheSur un cluster avec 50+ VMs, le cache divise par 5 le temps de chaque commande Ansible.
Configuration SSH des VMs
Section intitulée « Configuration SSH des VMs »Comme libvirt, le plugin Proxmox ne fournit pas directement les paramètres SSH (utilisateur, clé). Utiliser host_vars/ :
inventory/├── proxmox.yml└── host_vars/ ├── vm-100.yml └── vm-101.ymlhost_vars/vm-100.yml :
ansible_user: ansibleansible_ssh_private_key_file: ~/.ssh/lab_ed25519Ou plus malin : utiliser compose: pour calculer ansible_user selon le tag Proxmox :
compose: ansible_user: "'ec2-user' if 'aws' in proxmox_tags_parsed else 'ansible'"Variables exposées
Section intitulée « Variables exposées »Le plugin expose toute la config Proxmox de la VM :
- debug: msg: | VM {{ inventory_hostname }} : - Type : {{ proxmox_vmtype }} # qemu ou lxc - State : {{ proxmox_status }} # running, stopped - Memory : {{ proxmox_memory }} MB - Cores : {{ proxmox_cores }} - Node : {{ proxmox_node }} # pve01, pve02... - Tags : {{ proxmox_tags_parsed }} - IPs : {{ proxmox_agent_interfaces | default('agent absent') }}Toutes les variables Proxmox sont préfixées proxmox_ pour éviter les collisions.
Filtrer les VMs
Section intitulée « Filtrer les VMs »Pour ne garder que certaines VMs (ex: avec un tag spécifique), utiliser groups: Jinja :
plugin: community.general.proxmoxurl: https://proxmox.example.com:8006user: ansible@pvetoken_id: inventorytoken_secret: !vault | ...
groups: managed_vms: "'ansible' in (proxmox_tags_parsed | default([]))" prod_vms: "'prod' in (proxmox_tags_parsed | default([]))"Maintenant ansible managed_vms -m ping cible uniquement les VMs taggées ansible côté Proxmox. Les autres sont ignorées.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
requests module not found | Module Python manquant | pip install requests |
Authentication failed | Token mal configuré ou expiré | Re-créer le token avec Privilege Separation décoché |
| Pas d’IPs retournées | Agent QEMU absent ou désactivé | Installer qemu-guest-agent + activer côté Proxmox (qm set) |
| Permissions insuffisantes | Token sans rôle approprié | Donner PVEAuditor au user ansible@pve |
validate_certs: true plante | Certificat self-signed Proxmox | validate_certs: false (lab) ou trust le cert (prod) |
| Lent au démarrage | Cluster avec beaucoup de nodes | Activer le cache + filtrer avec groups: |
Comparaison libvirt vs Proxmox
Section intitulée « Comparaison libvirt vs Proxmox »| Critère | libvirt | Proxmox |
|---|---|---|
| Setup | Local (qemu:///system) | Token API + URL |
| VMs | Oui | Oui |
| LXC | Non | Oui |
| IPs | Non sans agent QEMU | Oui (avec agent QEMU) |
| Tags | Manuel via groups: | Tags Proxmox natifs |
| Multi-host | Non (one host = one libvirt) | Oui (cluster Proxmox) |
| Cas d’usage | Bare-metal homelab | Cluster Proxmox |
À retenir
Section intitulée « À retenir »community.general.proxmox= solution la plus complète pour homelab Proxmox.- Token API > password — créer un user dédié
ansible@pve+ tokeninventory. - Token secret chiffré avec Ansible Vault — jamais en clair.
- Agent QEMU indispensable pour récupérer les IPs automatiquement.
- VMs + LXC dans un même inventaire (avantage majeur sur libvirt).
- Tags Proxmox = grouping natif via
keyed_groups: proxmox_tags_parsed. PVEAuditor= permissions minimales suffisantes (lecture seule).