Netbox - Ajouter la topologie du réseau

Auteur : Vince NADUS
Date de publication : Dec. 6, 2021
netbox django python

Disposer des informations de son réseau c'est super en faire une représentation graphique c'est encore mieux


Pour rappel nous en sommes en Netbox 3.0.11.

Lors des versions précédentes de Netbox je m'étais essayé à réaliser une représentation graphique du réseau. Le rendu était .. comment pourrait on dire ... pas top.

J'ai donc voulu voir ce qu'il se faisait depuis.

J'ai donc trouvé 2 plugins :

https://github.com/iDebugAll/nextbox-ui-plugin

et

https://github.com/mattieserver/netbox-topology-views

mais ce dernier ne semble plus maintenu et surtout ne fonctionne plus avec Netbox v3 (lors de mes tests)

Voici le process

Installer le plugins via PIP

cd /opt/netbox
source /opt/netbox/venv/bin/activate
pip3 install nextbox-ui-plugin

Pour garder les pré-requis en cas de réinstallation ou de mise à jour

echo nextbox-ui-plugin >> local_requirements.txt

Activer le plugins dans Django

nano netbox/netbox/configuration.py

PLUGINS = [
'nextbox_ui_plugin',
]

Enfin finaliser l'installation

(venv) $ cd /opt/netbox/netbox/
(venv) $ python3 manage.py collectstatic
(venv) $ python3 manage.py migrate
systemctl restart netbox

Si vous rencontré des erreurs

(venv) $ python3 manage.py collectstatic --clear
(venv) $ python3 manage.py migrate

Vous pouvez accéder maintenant au plugin depuis le "Menu Principal > Plugfins > " ou depuis un "Site"

Pour aller plus loin

Les icônes fournient par défaut dans ce plugins ne me convenait pas :

https://developer.cisco.com/site/neXt/discover/demo/#Basic/icons

J'ai donc chercher un moyen de completer les icones.

Créer des icones png avec Photoshop ou en récupérer sur Internet. (Ici pts.png)

A partir de là voici les fichier à éditer afin d'ajouter de nouveaux icones.

Déplacer les images dans le dossier : /opt/netbox/netbox/static/nextbox_ui_plugin/img/

Ajouter pour chaque image la ligne suivante (ligne 80) en dessous d'un exemple dead_node :

nano /opt/netbox/netbox/static/nextbox_ui_plugin/next_app.js

topo.registerIcon("pts", "/static/nextbox_ui_plugin/img/pts.png", 49, 49);

Mettre en relation les objets et les images via leur role ou leur type :

nano /opt/netbox/netbox/netbox/configuration.py

Voici en exemple mon PLUGINS_CONFIG

PLUGINS_CONFIG = {
'nextbox_ui_plugin': {
'layers_sort_order': (
'edge',
'edge-switch',
'edge-router',
'core',
'core-router',
'core-switch',
'distribution',
'distribution-router',
'distribution-switch',
'access',
'access-switch',
'pts',
'undefined',
),
'icon_role_map': {
'router': 'router',
'firewall': 'firewall',
'server': 'server',
'nas': 'server',
'border': 'router',
'edge-switch': 'switch',
'edge-router': 'router',
'core-router': 'router',
'core-switch': 'switch',
'distribution': 'switch',
'distribution-router': 'router',
'distribution-switch': 'switch',
'access-switch': 'switch',
'pts': 'pts',
},
'DISPLAY_PASSIVE_DEVICES': True,
'DISPLAY_LOGICAL_MULTICABLE_LINKS': True,
'DISPLAY_UNCONNECTED': True
}
}

Aller encore plus loin:

Il me manque les interface qui sont en tagged-all je dois donc modifier la configuration

Editer le fichier de views

nano /opt/netbox-3.0.3/venv/lib/python3.9/site-packages/nextbox_ui_plugin/views.py

Ajouter à partir de la ligne 240

interfaces = vlan.get_interfaces()
interfaces2 = Interface.objects.filter(mode='tagged-all')
filtred_devices = [d.id for d in nb_devices_qs]
filtred_interfaces = []
for interface in interfaces:
if interface.is_connectable:
direct_device_id = interface.device.id
interface_trace = interface.trace()
if len(interface_trace) != 0:
termination_b_iface = interface_trace[-1][-1]
connected_device_id = termination_b_iface.device.id
if (direct_device_id in filtred_devices) or (direct_device_id in filtred_devices):
filtred_interfaces.append(interface)

for interface2 in interfaces2:
if interface2.is_connectable:
direct_device_id = interface2.device.id
interface2_trace = interface2.trace()
if len(interface2_trace) != 0:
termination_b_iface = interface2_trace[-1][-1]
connected_device_id = termination_b_iface.device.id
if (direct_device_id in filtred_devices) or (direct_device_id in filtred_devices):
filtred_interfaces.append(interface2)

devices = []
for interface in filtred_interfaces:
if interface.is_connectable:
if interface.device not in devices:
devices.append(interface.device)
interface_trace = interface.trace()
if len(interface_trace) != 0:
termination_b_iface = interface_trace[-1][-1]
if termination_b_iface.device not in devices:
devices.append(termination_b_iface.device)

Redémarrer le service pour la prise en compte

(venv) root@netbox:/opt/netbox# python netbox/manage.py collectstatic
You have requested to collect static files at the destination
location as specified in your settings:
/opt/netbox-3.0.11/netbox/static
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: yes
0 static files copied to '/opt/netbox-3.0.11/netbox/static', 392 unmodified.
(venv) root@netbox:/opt/netbox# systemctl restart netbox netbox-rq

Voilà maintenant notre topology par VLAN prend également en compte les port Trunk All Tagged