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