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
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:
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