Aller au contenu
Infrastructure as Code medium

Inventaire dynamique Proxmox VE avec community.general.proxmox

9 min de lecture

Logo Ansible

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

  • 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).
  • Un cluster ou serveur Proxmox VE 7+ opérationnel.
  • Token API Proxmox créé (procédure ci-dessous).
  • community.general collection installée.
  • requests Python côté control node : pip install requests.

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.

ChampValeur
Useransible@pve (créer ce user au préalable)
Token IDinventory
Privilege SeparationDécocher (sinon il faut donner les rôles séparément)
ExpireDate 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.

Créer inventory/proxmox.yml :

---
plugin: community.general.proxmox
url: https://proxmox.example.com:8006
user: ansible@pve
token_id: inventory
token_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256
3736...
validate_certs: true

Le token_secret doit être chiffré avec Ansible Vault :

Fenêtre de terminal
ansible-vault encrypt_string '<le-secret-token>' --name token_secret

Coller le résultat dans le YAML. Le déchiffrement se fait au runtime avec --ask-vault-pass.

Par défaut, le plugin ne liste que les VMs (KVM). Pour inclure aussi les conteneurs LXC :

plugin: community.general.proxmox
url: https://proxmox.example.com:8006
user: ansible@pve
token_id: inventory
token_secret: !vault | ...
want_facts: true # détails complets de chaque VM/LXC
want_proxmox_nodes_ansible_host: false # ne pas définir ansible_host depuis Proxmox

Tester :

Fenêtre de terminal
ansible-inventory -i inventory/proxmox.yml --graph

Sortie :

@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-200

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 :

Fenêtre de terminal
# RHEL/Alma/Rocky
sudo dnf install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
# Debian/Ubuntu
sudo apt install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent

Cô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 :

Fenêtre de terminal
ansible-inventory -i inventory/proxmox.yml --host vm-100 | grep -i ip

Vous voyez les IPs réelles de la VM (privée et publique si configurées).

Proxmox 7+ supporte les tags sur chaque VM/LXC. Le plugin les utilise comme keyed_groups :

plugin: community.general.proxmox
url: https://proxmox.example.com:8006
user: ansible@pve
token_id: inventory
token_secret: !vault | ...
want_facts: true
keyed_groups:
# Un groupe par tag Proxmox
- prefix: tag
key: proxmox_tags_parsed
parent_group: lab_vms

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

plugin: community.general.proxmox
url: https://proxmox.example.com:8006
user: ansible@pve
token_id: inventory
token_secret: !vault | ...
cache: true
cache_plugin: jsonfile
cache_timeout: 300
cache_connection: /tmp/ansible_proxmox_cache

Sur un cluster avec 50+ VMs, le cache divise par 5 le temps de chaque commande Ansible.

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

host_vars/vm-100.yml :

ansible_user: ansible
ansible_ssh_private_key_file: ~/.ssh/lab_ed25519

Ou 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'"

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.

Pour ne garder que certaines VMs (ex: avec un tag spécifique), utiliser groups: Jinja :

plugin: community.general.proxmox
url: https://proxmox.example.com:8006
user: ansible@pve
token_id: inventory
token_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.

SymptômeCauseFix
requests module not foundModule Python manquantpip install requests
Authentication failedToken mal configuré ou expiréRe-créer le token avec Privilege Separation décoché
Pas d’IPs retournéesAgent QEMU absent ou désactivéInstaller qemu-guest-agent + activer côté Proxmox (qm set)
Permissions insuffisantesToken sans rôle appropriéDonner PVEAuditor au user ansible@pve
validate_certs: true planteCertificat self-signed Proxmoxvalidate_certs: false (lab) ou trust le cert (prod)
Lent au démarrageCluster avec beaucoup de nodesActiver le cache + filtrer avec groups:
CritèrelibvirtProxmox
SetupLocal (qemu:///system)Token API + URL
VMsOuiOui
LXCNonOui
IPsNon sans agent QEMUOui (avec agent QEMU)
TagsManuel via groups:Tags Proxmox natifs
Multi-hostNon (one host = one libvirt)Oui (cluster Proxmox)
Cas d’usageBare-metal homelabCluster Proxmox
  • community.general.proxmox = solution la plus complète pour homelab Proxmox.
  • Token API > password — créer un user dédié ansible@pve + token inventory.
  • 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).

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn