NetBoxRéseauDevOpsPython

NetBox API : automatiser la gestion de l'infrastructure réseau

15 octobre 2026 · Sphinx-Digital

NetBox n’est utile que si ses données sont à jour. La mettre à jour manuellement, c’est recréer le problème qu’elle est censée résoudre. L’API NetBox permet d’automatiser les mises à jour depuis vos processus de provisionnement.

pynetbox : le client Python officiel

import pynetbox

nb = pynetbox.api(
    'https://netbox.example.com',
    token='votre-token-api'
)

# Récupérer tous les devices d'un site
devices = nb.dcim.devices.filter(site='paris-dc1')
for device in devices:
    print(f"{device.name}{device.device_role}{device.primary_ip}")

# Créer un nouveau device
new_device = nb.dcim.devices.create(
    name='srv-web-03',
    device_type=nb.dcim.device_types.get(model='Dell PowerEdge R750').id,
    device_role=nb.dcim.device_roles.get(slug='web-server').id,
    site=nb.dcim.sites.get(slug='paris-dc1').id,
    status='planned'
)
print(f"Device créé : ID {new_device.id}")

Créer et gérer des adresses IP

# Allouer la prochaine IP disponible dans un préfixe
prefix = nb.ipam.prefixes.get(prefix='10.10.0.0/24')
next_ip = prefix.available_ips.list()[0]

# Créer l'IP et l'assigner à une interface
ip = nb.ipam.ip_addresses.create(
    address=next_ip['address'],
    status='active',
    dns_name=f'srv-web-03.paris.example.com',
    description='Serveur web production',
    assigned_object_type='dcim.interface',
    assigned_object_id=interface.id
)

# Définir comme IP primaire du device
new_device.primary_ip4 = ip
new_device.save()

Webhooks : synchroniser NetBox avec votre infra

# Configurer un webhook dans NetBox :
# Objet : Device | Événement : Created, Updated
# URL : https://automation.example.com/webhooks/netbox

# Votre endpoint d'automation (FastAPI)
from fastapi import FastAPI, Request
app = FastAPI()

@app.post("/webhooks/netbox")
async def netbox_webhook(request: Request):
    payload = await request.json()

    event = payload['event']
    device = payload['data']

    if event == 'created' and device['status']['value'] == 'active':
        # Déclencher le provisionnement Ansible
        await trigger_ansible_playbook(
            playbook='provision-server.yml',
            extra_vars={
                'device_name': device['name'],
                'ip_address': device['primary_ip']['address'],
                'device_role': device['device_role']['slug']
            }
        )
    return {"status": "ok"}

Inventaire dynamique Ansible depuis NetBox

# netbox_inventory.py — script d'inventaire dynamique
import json
import pynetbox

nb = pynetbox.api('https://netbox.example.com', token=os.environ['NETBOX_TOKEN'])

def get_inventory():
    inventory = {'_meta': {'hostvars': {}}}

    for device in nb.dcim.devices.filter(status='active'):
        if not device.primary_ip:
            continue

        ip = str(device.primary_ip.address).split('/')[0]
        hostname = device.name
        role = device.device_role.slug

        # Grouper par role
        if role not in inventory:
            inventory[role] = {'hosts': []}
        inventory[role]['hosts'].append(hostname)

        # Variables par host
        inventory['_meta']['hostvars'][hostname] = {
            'ansible_host': ip,
            'netbox_device_id': device.id,
            'netbox_site': device.site.slug,
            'netbox_tags': [t.slug for t in device.tags]
        }

    return inventory

if __name__ == '__main__':
    print(json.dumps(get_inventory(), indent=2))
# Utiliser l'inventaire dynamique
ansible-playbook -i netbox_inventory.py deploy.yml --limit web-server

Notre formation NetBox couvre l’API et l’intégration avec les outils d’automatisation réseau.