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.