Aller au contenu
Infrastructure as Code medium

Inventaire dynamique NetBox avec netbox.netbox.nb_inventory

9 min de lecture

Logo Ansible

NetBox est la référence open-source en IPAM/DCIM : il gère vos racks, vos devices physiques, vos VMs, vos VLANs, vos prefixes IP. Si NetBox est déjà déployé chez vous, il est la source de vérité naturelle pour Ansible — pas la peine de dupliquer l’inventaire ailleurs.

Le plugin netbox.netbox.nb_inventory transforme votre instance NetBox en inventaire Ansible dynamique avec des filtres très fins (par site, par role, par status, par tag, par tenant). C’est le pattern recommandé dans les moyennes/grandes entreprises qui ont déjà investi dans NetBox.

  • Configurer le plugin avec un token API NetBox.
  • Filtrer les hôtes par site, role, status, tag NetBox.
  • Grouper automatiquement par les attributs NetBox.
  • Récupérer les IPs depuis l’IPAM NetBox.
  • Combiner devices physiques et virtualization dans un même inventaire.
  • Une instance NetBox 3.x ou 4.x opérationnelle.
  • Token API NetBox créé.
  • Collection netbox.netbox installée.
  • pynetbox Python : pip install pynetbox.

Sur l’UI NetBox : User → API Tokens → Add a token.

ChampValeur recommandée
Useransible-readonly (créer ce user au préalable)
DescriptionInventaire dynamique Ansible
Write enabled❌ Décocher (lecture seule)
Allowed IPsIP du control node Ansible (restriction réseau)
ExpiresDate d’expiration (ex: 1 an)

Copier le token généré — il sera utilisé une seule fois (mais peut être recréé).

Fenêtre de terminal
ansible-galaxy collection install netbox.netbox
pip install pynetbox

Activer dans ansible.cfg :

[inventory]
enable_plugins = host_list, script, auto, yaml, ini, netbox.netbox.nb_inventory

Créer inventory/netbox.yml :

---
plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.example.com
token: !vault |
$ANSIBLE_VAULT;1.1;AES256
3736...
validate_certs: true

Le token chiffré avec Ansible Vault :

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

Tester :

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

Sortie : tous vos devices NetBox apparaissent comme des hôtes Ansible.

Sans filtre, le plugin retourne toutes les machines de NetBox. Pour ne garder que certaines :

plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.example.com
token: !vault | ...
# Filtres NetBox (équivalent des filtres URL de l'API REST)
query_filters:
- status: active
- role: webserver
- tag: managed-by-ansible

Avantage : la liste retournée par NetBox est déjà filtrée côté API — moins de payload, plus rapide.

# Multi-site
query_filters:
- status: active
- site: paris

NetBox a déjà ses propres attributs structurés (site, role, manufacturer, status). Le plugin les expose automatiquement :

plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.example.com
token: !vault | ...
group_by:
- device_roles # → groupe par role: webserver, dbserver, switch
- sites # → groupe par site: paris, londres
- device_types # → groupe par modèle: Dell-R740, HP-DL380
- tags # → groupe par tag NetBox
- status # → groupe par status: active, planned, decommissioning
- regions # → groupe par région
- tenants # → groupe par tenant (multi-tenant NetBox)

Résultat :

@all:
|--@device_roles_webserver:
| |--web1.paris.example.com
| |--web2.paris.example.com
|--@device_roles_dbserver:
| |--db1.paris.example.com
|--@sites_paris:
| |--web1.paris.example.com
| |--db1.paris.example.com
|--@status_active:
| |--... (toutes les machines actives)

Vous pouvez maintenant cibler device_roles_webserver:&sites_paris pour les webservers du site Paris uniquement.

NetBox distingue les devices physiques des VMs (virtualization). Pour inclure les deux :

plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.example.com
token: !vault | ...
config_context: false # ne pas charger les config_contexts (alourdit)
fetch_all: true # paginer pour gros parcs
# Inclure les VMs en plus des devices
plurals: true
fetch_virtual_chassis: true
include_status: true

Par défaut, le plugin inclut déjà les VMs. Mais sur des installations NetBox spécifiques, vérifier que fetch_all: true et que les VMs ont bien le statut active.

NetBox stocke les IPs primaires sur chaque device/VM. Le plugin les utilise automatiquement comme ansible_host si configuré :

plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.example.com
token: !vault | ...
compose:
ansible_host: primary_ip4.address.split('/')[0] | default(name)
ansible_user: "'admin' if 'switch' in tags else 'ansible'"

compose: est puissant : il calcule des variables Ansible à partir des données NetBox. Ici on extrait l’IPv4 (sans le CIDR) et on choisit l’utilisateur SSH selon le tag.

Pour chaque host, le plugin expose tous les attributs NetBox :

- debug:
msg: |
Device {{ inventory_hostname }} :
- Site : {{ site.name }}
- Role : {{ device_role.name }}
- Manufacturer : {{ device_type.manufacturer.name }}
- Model : {{ device_type.model }}
- Serial : {{ serial }}
- Status : {{ status.label }}
- Primary IP : {{ primary_ip4.address }}
- VLAN : {{ vlan.vid }}
- Tags : {{ tags | map(attribute='name') | list }}

C’est ce qui rend NetBox si puissant : vos playbooks ont accès à toute la donnée IPAM/DCIM sans dupliquer ailleurs.

NetBox peut être lent sur de gros parcs (300+ devices). Cache obligatoire :

plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.example.com
token: !vault | ...
cache: true
cache_plugin: jsonfile
cache_timeout: 600
cache_connection: /tmp/ansible_netbox_cache

Pour rafraîchir après modification dans NetBox :

Fenêtre de terminal
ansible-inventory -i inventory/netbox.yml --list --refresh-cache
Fenêtre de terminal
ansible-playbook -i inventory/netbox.yml \
--limit 'sites_paris:&device_types_dell-r740' \
patch-rhel.yml

Configurer uniquement les machines en statut “planned”

Section intitulée « Configurer uniquement les machines en statut “planned” »
Fenêtre de terminal
ansible-playbook -i inventory/netbox.yml \
--limit 'status_planned' \
bootstrap.yml

NetBox suit le cycle de vie : plannedactivedecommissioningdecommissioned. Cibler les planned permet de bootstrap uniquement les nouvelles machines.

Fenêtre de terminal
ansible-playbook -i inventory/netbox.yml \
--limit 'tags_pci-dss' \
audit-pci.yml

Toutes les machines taggées pci-dss dans NetBox sont auditées. Aucune liste à maintenir — la source de vérité est NetBox.

SymptômeCauseFix
pynetbox not foundModule Python manquantpip install pynetbox
401 UnauthorizedToken expiré ou mal écritRecréer le token, vérifier les permissions
Inventaire incompletfetch_all: false (défaut)fetch_all: true pour > 1000 devices
Lent (>10s)Pas de cachecache: true mandatory
Allowed IPs bloqueToken configuré avec IP allowedAjouter l’IP du control node
Tags absentsplurals: true non configuréplurals: true pour grouper par tags
CritèreNetBox recommandéAutre solution
Source de vérité IPAM/DCIM existante
Petit parc (< 50 hôtes)SurdimensionnéStatique YAML
Cloud public (AWS/Azure/GCP)Plugin cloud directNetBox redondant
Mix on-prem + cloudPossible (NetBox sync)Plusieurs -i
Audit conformité (tags, owners)✅ excellenceGalère sans NetBox
  • NetBox = source de vérité IPAM/DCIM unifiée — pas de duplication d’inventaire.
  • netbox.netbox.nb_inventory = plugin officiel maintenu par NetBox Labs.
  • Token chiffré Vault + restriction Allowed IPs au token.
  • query_filters: = filtrer côté API (status, role, site, tag).
  • group_by: = grouper par attributs NetBox natifs.
  • compose: = calculer ansible_host, ansible_user depuis NetBox.
  • Cache mandatory dès qu’on dépasse quelques centaines de devices.

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