lumnik. / scénarios Tous les scénarios · English

NetBox: tout l'inventaire réseau lu avec un jeton en lecture

Objectif Lire chaque nuit tous les équipements d'un NetBox, la référence de l'équipe réseau, avec un jeton en lecture seule.

NetBox est bâti sur Django REST Framework: count, next et results dans chaque réponse, et un jeton présenté par le mot Token, pas Bearer. lumnik nomme les deux:

manifests/lab-docker-compose.yml
# The network team's source of truth: a real NetBox, its devices read through the REST API.name: lumnik-netboxservices:  netbox:    image: netboxcommunity/netbox:v4.1    depends_on: [postgres, redis, redis-cache]    environment:      DB_HOST: postgres      DB_NAME: netbox      DB_USER: netbox      DB_PASSWORD: netbox-lab                 # the lab's own, on this machine only      REDIS_HOST: redis      REDIS_CACHE_HOST: redis-cache      SECRET_KEY: lab-only-secret-key-0123456789abcdefghijklmnopqrstuvwxyz-0123456789      SUPERUSER_NAME: netbox-admin      SUPERUSER_EMAIL: admin@netbox.test      SUPERUSER_PASSWORD: netbox-admin-pw-1      SKIP_SUPERUSER: "false"      ALLOWED_HOSTS: "*"    ports: ["127.0.0.1:${NETBOX_PORT:-9270}:8080"]   # this machine only: the admin password is the lab's  postgres:    image: postgres:16-alpine    environment:      POSTGRES_DB: netbox      POSTGRES_USER: netbox      POSTGRES_PASSWORD: netbox-lab    tmpfs: ["/var/lib/postgresql/data"]  redis:    image: valkey/valkey:8.0-alpine  redis-cache:    image: valkey/valkey:8.0-alpine
manifests/10-devices.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-netbox-a  connector_type: rest-generic  scopes: [network]spec:  base_url: http://host.docker.internal:9270/api  auth: { kind: bearer, scheme: Token, token_env: SCENARIO_NETBOX_TOKEN }   # Django REST Framework's token word  headers:    - { name: Accept, value: application/json }  endpoints:    - id: devices      path: /dcim/devices/      method: GET      pagination: { kind: drf-limit-offset, limit: 50 }      # NetBox is Django REST Framework      target:        kind: hybrid        table: ext.scenario_netbox_a        unique_key: $.id        promote:          - { name: name, path: $.name, type: text }          - { name: site, path: $.site.slug, type: text }          - { name: status, path: $.status.value, type: text }          - { name: model, path: $.device_type.model, type: text }          - { name: last_updated, path: $.last_updated, type: timestamptz }
$ lm connector run scenario-netbox-a
run scheduled: 5ae5a95b-1125-43b5-8921-f15a6ef53d0e

$ lm run get 5ae5a95b-1125-43b5-8921-f15a6ef53d0e
ID        CONNECTOR          ENDPOINT  STATUS     IN   OUT  SKIPPED  DEAD-LETTERS  STARTED           ENDED             EVALUATED
5ae5a95b  scenario-netbox-a  devices   Completed  120  120  0        0             2026-10-30 22:51  2026-10-30 22:51  yes
lille
8 offline · 40 devices
lyon
8 offline · 40 devices
nantes
14 offline · 40 devices

preuves: replay.log, page-1.json, requests-connect.txt, offline-before.txt, offline-after.txt, offline-by-site.txt · transform v1

Limites

  • Chaque nuit relit tout l'inventaire. Le filtre last_updated de NetBox permettrait de ne relire que les changements; ce rejeu ne le montre pas, son inventaire étant créé dans la minute.
  • Un équipement supprimé de NetBox reste dans le hub avec son dernier état.
  • NetBox de démonstration, équipements synthétiques.

Réseau · inventaire

L'inventaire réseau vit dans NetBox.

Il faut le lire chaque nuit, sans droit d'écriture.

NetBox de démonstration

Le problème

NetBox refuse le jeton tel qu'on l'envoie d'habitude.

  • Il attend « Token <clé> », pas « Bearer <clé> ».
  • C'est la règle de Django REST Framework, sur lequel il est bâti.

Ce qui n'est pas modifié

NetBox reste tel quel.

  • Un jeton en lecture seule.
  • Son API REST standard.

Ce qu'il a fallu écrire

auth: { kind: bearer, scheme: Token }
pagination: { kind: drf-limit-offset }

On nomme le framework et son mot.

Un connecteur de 28 lignes.

Le rouge

Le rejeu a trouvé un manque.

  • Le hub n'écrivait que « Bearer ».
  • Il fallait ranger « Token » dans le secret: corrigé (icreated/lumnik#1640).

Le vert

120 équipements, 3 requêtes.

  • La nuit suivante, 6 switchs passés hors ligne.
  • Le hub les compte par site.

La limite

Chaque nuit relit tout l'inventaire.

  • Le filtre last_updated de NetBox permettrait de ne relire que les changements.
  • Un équipement supprimé reste dans le hub, avec son dernier état.

Essayer

Le scénario se rejoue en local.

Un vrai NetBox, chaque étape publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →