[PYTHON] Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!

NetOpsCoding Advent Clender Dies ist der Artikel zum 7. Tag. In diesem Artikel verwenden wir Django, um Informationen zu Netzwerkgeräten abzurufen. Als Webanwendung erfahren Sie, wie Sie ein Dashboard erstellen, mit dem Sie den Status auf einmal überprüfen können. (Das Ziel für die Informationserfassung ist hauptsächlich der Router, nicht der Switch.) スクリーンショット 2016-12-07 5.09.55.png

** Das diesmal erstellte Dashboard wurde auf den folgenden Git hochgeladen. Qiita erklärt die Details nicht. Weitere Informationen finden Sie im aktuellen Artikel. ** https://github.com/Mabuchin/netboard

Einführung

Von der Antike bis zur Gegenwart wurden verschiedene Tools entwickelt, um den Status von Netzwerkgeräten zu ermitteln. Kakteen, MRTG, Zabbix, Munin und so weiter ... Natürlich sind diese Tools sehr nützliche Tools, um den Netzwerkstatus zu überprüfen, wenn sie gut verwendet werden. In der Tat sollte es der Standard an verschiedenen Einsatzorten sein. Wenn ich es jedoch auf der tatsächlichen Operationsseite verwende, möchte ich eine andere Funktion. Ich wünschte, ich könnte dies auch sehen ... Ich denke, es gibt viele solche Phänomene. Die Netzwerkbetriebsstandorte sind nicht alle gleichzeitig, und jeder Betriebsstandort sollte verschiedene Dinge enthalten, die Sie auf einen Blick überprüfen möchten. Insbesondere bei der Überprüfung des Status durch Fehlerbehebung hängt das, was Sie zuerst sehen, davon ab, was Sie überwachen.

Dieses Mal habe ich unter regelmäßiger Verwendung der oben genannten ** Überwachungstools ** ein Dashboard erstellt, mit dem Sie nur die gewünschten Informationen bei Problemen und während der Arbeit ** auf einer Seite des Webs ** anzeigen können. schauen.

Erfassungsinformationen und Erfassungsmethode

Diesmal ** BGP und [AS operation](https://www.nic.ad.jp/ Angenommen, ein Netzbetreiber, der ja /grundlagen / Begriffe / as.html) ** ausführt, bestimmt die zu erfassenden Informationen. Wenn Sie es selbst machen möchten, können Sie es gemäß den Anforderungen jeder Organisation machen, aber diesmal werde ich oben darüber nachdenken, was am einfachsten vorstellbar ist. Die diesmal zu bestätigenden Punkte sind wie folgt.

Dieses Mal erstellen wir ein Dashboard, das die oben genannten Elemente anzeigt.

Installation

Die wichtigsten externen Bibliotheken, die dieses Mal verwendet werden, sind folgende. Python wird von pip bezogen, und verschiedene Front-Display-Module wie JavaScrip werden vom Web bezogen.

Da das Python-Modul "require.txt" auf Github veröffentlicht hat, ist es auch möglich, alle auf einmal wie folgt herunterzuladen.

cd ./netboard
pip install -r requirements.txt

Wenn Sie ab 1 verwenden möchten, benötigen Sie das Django-Projekt-Setup Wirken Sie die Zaubersprüche zum Erstellen eines Django-Projekts und zum Erstellen einer Anwendung auf fließende Weise, wie unten gezeigt.

% django-admin.py startproject netopboard
% cd netopboard
% python manage.py createsuperuser
(Snip)
% python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
%python manage.py startapp device_mon

Wenn Sie fertig sind, überprüfen Sie, ob Django funktioniert

% python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
December 05, 2016 - 08:16:56
Django version 1.10.4, using settings 'netopboard.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Erstellen Sie ein Modell, das Routerinformationen verwaltet

Wenn Sie Informationen von einem Gerät erhalten, benötigen Sie Anmeldeinformationen, um auf den Router zugreifen zu können. In den meisten Fällen benötigen Sie die Ziel-IP-Adresse, die SNMP-Community, das Anmeldekennwort usw. Dieses Mal werde ich die Informationen in Djangos Modell definieren, damit ich einfach eine Datenbank erstellen kann. Die Definition des DB-Modells von Django gilt nicht für jedes Projekt, sondern für die interne Anwendung. Sie wird daher unter der erstellten Anwendung "device_mon" definiert. Dieses Mal sind auch die Betriebssysteminformationen des Geräts enthalten, da das Verhalten abhängig vom Betriebssystem des Geräts geändert werden muss.

Wenn diese als Djangos Modell definiert sind, sieht es wie folgt aus.

device_mon/models.py


class Device(models.Model):
    hostname = models.CharField('Hostname',max_length=255,unique = True,)
    management_ip = models.GenericIPAddressField('Management IP address',null = True,blank = True,)
    snmp_community = models.CharField('SNMP community',max_length = 255,null = True,blank = True,)
    os = models.CharField('OS',max_length = 255,validators = [AsciiValidator],)
    user = models.CharField('User Name',max_length = 255,null = True,blank = True,)
    password = models.CharField('User Password',max_length = 255,null = True,blank = True,)
    enable_password =  models.CharField('Enable Password',max_length = 255,null = True,blank = True,)
    status = models.PositiveIntegerField('Status',default = 0)

    class Meta:
        verbose_name = 'Device'
        verbose_name_plural = 'Devices'

    def __unicode__(self):
        return self.hostname

Normalerweise ist es besser, die Eingaberegel mit Validator usw. zu bestimmen, aber dieses Mal werde ich diesen Punkt weglassen. Nachdem Sie das Modell definiert haben, müssen Sie tatsächlich eine Datenbank erstellen. Erstellen Sie also eine Datenbank wie folgt.

% python manage.py makemigrations device_mon
Migrations for 'device_mon':
  device_mon/migrations/0001_initial.py:
    - Create model Device

Zu diesem Zeitpunkt ist die Gründung abgeschlossen: v:

** Nicht alle folgenden Erklärungen werden erläutert. Einige Teile werden weggelassen, da nur die Hauptpunkte abgekratzt werden. Einzelheiten finden Sie im Github-Code **

Erstellen eines Startbildschirms

Lassen Sie uns zunächst einen Startbildschirm erstellen. Wenn Sie eine Seite erstellen, auf der sich Ihr Dashboard befindet, haben Sie eine Seite wie diese! スクリーンショット 2016-12-06 5.15.37.png

Ansichten und Vorlage

Zeigen Sie zunächst die Liste der Netzwerkgeräte an und erstellen Sie eine Startseite, um den aktiven Status zu überprüfen und zur detaillierten Seite zu wechseln. Da ich die Router-Informationen hier im Listenformat anzeigen möchte, habe ich HTML wie folgt aus Views.py gezeichnet. HTML ist eine Beschreibung, die die Template-Engine in Django verwendet.

views.py


from django.shortcuts import render
from device_mon.models import Device

def device_list(request):
    return render(request, 'device_mon/index.html', dict(devices=Device.objects.all().order_by('hostname')))

In Ansichten werden alle Geräteobjekte erfasst und an die Vorlage übergeben. In der Vorlage empfängt es es und zeichnet HTML basierend auf diesen Informationen. In der Vorlage ist es möglich, mit anderen zu verzweigen, wenn die empfangenen Informationen angezeigt werden sollen. Es ist eine einfache Vorlage, die Geräteobjekte empfängt und so viele Tabellenspalten zeichnet, wie vorhanden sind, während der Inhalt wiedergegeben wird. Wenn der lebendige Überwachungsteil NG ist, wird die Schaltfläche durch "if" geändert, um nicht zum Detailinformationsbildschirm überzugehen.

template/index.html


    <table class="table table-bordered table-condensed sortable table-hover" data-sort-key="0" id="bgp_statuses">
      <thead>
      <tr>
        <th>Hostname</th>
        <th>Address</th>
        <th>Access</th>
        <th>Detail</th>
      </tr>
      <tbody>
            {% for device in devices %} 
            <tr>
                <div class="form-group">
                    <td><strong>{{ device.hostname }}</strong></td>
                    <td class="target-data">{{ device.management_ip }}</td>
                    {% if device.status == 1 %}
                    <td><button type="submit" class="btn btn-success btn-xs btn-block " disabled="disabled">OK</button></td>
                    <form class= "form-inline" action="{% url 'device_mon:result' %}" method="post" role="form">
                        <input type="hidden" name="routerinfo_id" value="{{ device.id }}">
                        {% csrf_token %}
                        <td><button type="submit" class="btn btn-primary btn-xs btn-block">Check</button></td>
                    </form>
                    {% else %}
                    <td><button type="submit" class="btn btn-danger btn-xs btn-block" disabled="disabled">NG</button></td>
                    <td><button type="submit" class="btn btn-default btn-xs btn-block" disabled="disabled">Check</button></td>
                    {% endif %}
                </div>
            </tr>
            {% endfor %}
      </tbody>
      </table>

Tipps: Einfacher Zugriff auf die Datenbank mithilfe von Verwaltungsbefehlen

Auf der oberen Seite wird zusätzlich zur Liste der Router die lebendige Überwachung jedes Routers durchgeführt. Dies ist nur ein regelmäßiger Ping hinter den Kulissen und das Speichern des Ergebnisses. Zu diesem Zeitpunkt wird beim Pingen mit einem vollständig externen Programm und Speichern in der Datenbank die Datenbank direkt gespeichert. Sie müssen so etwas wie bearbeiten. Wie Sie jedoch aus Views.py usw. sehen können, können Sie das Objekt einfach bedienen, indem Sie models aus der Django-Anwendung heraus aufrufen.

Djangos benutzerdefinierte Verwaltungsbefehle, wenn Sie Objekte von außerhalb und nicht vom Web aus ändern oder referenzieren müssen. Sie können das Programm als zusätzlichen Befehl in der manage.py der Django-App ausführen. In diesem Fall kann das Ergebnis der lebendigen Überwachung als Modell von Django betrieben werden, indem ein Programm wie "Geräte_Alive.py" unter "/ Geräte_Mon / Management / Befehle /" ersetzt und anschließend "Python-Verwaltung.py Geräte_Alive" ausgeführt wird. Kann in der Datenbank von reflektiert werden

devices_alive.py


#! /usr/bin/env python
# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand
from device_mon.models import Device
import pyping


class Command(BaseCommand):
    def handle(self, *args, **options):

        devices = Device.objects.all()

        for device in devices:
            response = pyping.ping(device.management_ip, count=1, timeout=1000)
            if response.ret_code == 0:
                device.status = 1
            else:
                device.status = 0

            device.save()

Analysieren des BGP / Schnittstellenstatus

Verwenden Sie für die Informationen, die Sie direkt durch Anmelden am Router anstelle von SNMP erhalten möchten, die erwarteten Daten. Natürlich kann dieser Teil durch netconf oder API verschiedener Netzwerkgeräte ersetzt werden. Da ich es jedoch für Geräte verwenden möchte, die von netconf usw. nicht unterstützt werden oder aus verschiedenen Gründen nicht verwendet werden können, werde ich diesmal eine Traurigkeit erwarten. Ich gehe nicht regelmäßig, um es zu bekommen, ich muss nur gehen, um es zu bekommen, wenn ich es bestätigen muss, also werde ich versuchen, es zu einer Struktur zu machen, die ich bekommen werde, wenn ich den Check-Knopf oben in Django drücke. Der Anrufverlauf ist wie folgt.

  1. HTML POST
  2. Wird von urls.py erkannt und die Operation an die Zielansichten übergeben
  3. Rufen Sie das Expect-Skript in Views.py auf
  4. Geben Sie das Ergebnis von Views in HTML zurück und spiegeln Sie es im Web wider

Exscript, eine Variante von pexpect, wird zur Erfassung verwendet. Der folgende Artikel war sehr hilfreich Versuchen Sie, mit SSH (Exscript) von Software zu Router zu wechseln

Führen Sie einen Befehl über den Webbildschirm aus

Da die Informationen, die nur vom Portal erfasst werden können, begrenzt sind, ist es praktisch, wenn Sie einen Bestätigungsbefehl auf dem Router ausgeben möchten, um detailliertere Informationen zu erhalten. So: arrow_down: cmd_response.gif

Der Befehl, den Sie ausführen möchten, wird mit urls.py an das Exscript auf der Rückseite gesendet, und der Antwortinhalt wird im modalen Teil wiedergegeben.

Neudarstellung nur einiger Bildschirme von Ajax

Da sich die auszuführenden Argumente je nach Befehl ändern, habe ich diesmal den gewünschten Befehl in die URL eingefügt.

urls.py


    url(r'^cmd_response/(?P<device_id>\d+)/(?P<cmd>.+)$', views.get_cmd_response, name='cmd_response')

Wenn device_id die DB-ID für die Geräteidentifikation ist und device_id der Befehlsteil ist, den Sie tatsächlich eingeben möchten, und der Wert zurückgegeben wird, In Ajax wird nur der modale Teil neu gezeichnet, und der modale Teil wird nach Abschluss angezeigt.

python


  var AjaxReload = function(url,target_id) {
          $.ajax({
                 url: url,
                 dataType: 'html',
                 beforeSend: function(){
                    dispLoading("Now Loading...");
                  },
                 success: function(data) {
                     $(target_id).html(data);
                 },
                 error:function() {
                     alert('Reload Error!');
                     removeLoading();
                 },
                 complete : function() { ///Warten Sie, bis das Ergebnis der Befehlsausführung zurückgegeben wird, bevor Sie modal anzeigen
                     removeLoading();
                     if(target_id=="#cmd_exec_result"){
                        $('#commandModal').modal('show')
                     }
                 }
          });
  }

device_mon/views.py



#plain cmd exec
def get_cmd_response(request,device_id,cmd):
    if cmd == 'None':
        cmd_result = 'None'
    else:
        cmd = cmd.replace('_',' ') # replace : show_bgp_su -> show bgp su
        device = Device.objects.get( pk = device_id )
        cmd_result = get_cmd(device,cmd)
    context = {
            'cmd_response'   : cmd_result,
            }
    return render(request,'device_mon/cmd_modal.html',context)

Echtzeiterfassung von Verkehr, CPU, Speicher

Es besteht darin, SNMP hinter den Kulissen zu erfassen und das Ergebnis mit WebSocket zurückzugeben. Hier finden Sie Informationen zum folgenden NetOps Coding Advent Calender, den ich letztes Jahr geschrieben habe.

Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu rendern http://qiita.com/Mabuchin/items/135a9edff34a3db00744

Bitte sehen Sie. Das serverseitige Programm von Websocket wurde nicht zu einem Daemon gemacht, aber es ist in Ordnung, wenn Sie es so starten.

cd websock_server
nohup python if_traffic_wss.py &
nohup python process_wss.py &

Als Ergänzung gibt es viele Fälle, in denen Sie die MIB jedes Anbieters für die CPU und den Speicher verwenden müssen. Die SNMP-OID von IOS-XR und JUNOS verwendet Folgendes.

python


JUNOS_CPU_USE = '.1.3.6.1.4.1.2636.3.1.13.1.8.9.1.0.0'
JUNOS_MEM_USE = '.1.3.6.1.4.1.2636.3.1.13.1.11.9.1.0.0'
IOSXR_CPU_USE = '.1.3.6.1.4.1.9.9.109.1.1.1.1.7.2'
IOSXR_MEM_USE = '.1.3.6.1.4.1.9.9.221.1.1.1.1.18'
IOSXR_MEM_FREE = '.1.3.6.1.4.1.9.9.221.1.1.1.1.20'

IOS-XR kann die Speichernutzungsrate nicht auf einmal ermitteln. In-Use-Speicher / (freier Speicher + In-Use-Speicher) Nachdem ich in Form von danach gefragt habe, schiebe ich es an den Client von WebSocket.

mem_use = int((float(mem_use) / float(mem_use+mem_free) ) * 100)

Schließlich

Es ist lange her, aber ich habe vorgestellt, wie Sie Ihr eigenes Dashboard erstellen können. In letzter Zeit hat die Anzahl nützlicher Tools für die Überwachung zugenommen, aber es ist schwierig, eines zu finden, das perfekt zu Ihrer eigenen Betriebsrichtlinie passt. Für eine regelmäßige Überwachung sollten Sie sie sich zusammen ansehen. Wenn Sie jedoch ein Tool benötigen, mit dem Sie alle Informationen anzeigen können, die Sie sofort überprüfen müssen, z. B. während einer Wartung oder eines Ausfalls, ist es meiner Meinung nach eine gute Idee, ein Portal zu erstellen, das der Betriebsrichtlinie wie dieser entspricht. Ich werde.

Zusammenfassung des Referenzlinks

Netboard (diesmal Dashboard erstellt) Einführung in Django (1) Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu rendern Versuchen Sie, mit SSH (Exscript) von Software zu Router zu wechseln

Recommended Posts

Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Erstellen Sie eine Homepage mit Django
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie mit Django eine API für die soziale Integration von Smartphone-Apps
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
Erstellen Sie ein Modell für Ihren Django-Zeitplan
Erstellen Sie einen Django-Zeitplan
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Code-Server-Online-Umgebung (2) Erstellen Sie mit Boto3 ein virtuelles Netzwerk
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Todo-App mit Django erstellen ⑤ Funktion zum Bearbeiten von Aufgaben erstellen
Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).
Erstellen einer Django-Umgebung für Win10 (mit virtuellem Speicherplatz)
Erstellen Sie eine API mit Django
Erstellen Sie einen Django-Anmeldebildschirm
Erstellen Sie ein Verzeichnis mit Python
[Memo] Erstellen Sie mit Docker eine Entwicklungsumgebung für Django + Nuxt.js
Empfehlung von Django, Bachstelze ~ Warum eine Website mit Python entwickeln ~
Erstellen Sie ein untergeordnetes Konto für die Verbindung mit Stripe in Python
[Django] Erstellen Sie ein Modell, das für Telefonnummer / Postleitzahl geeignet ist
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
(Für Anfänger) Versuchen Sie, mit Django eine einfache Web-API zu erstellen
Schritte zum Erstellen eines Django-Projekts
Stellen Sie die Django-Anwendung mit Docker bereit
Erstellen Sie eine virtuelle Umgebung mit Python!
Schreiben Sie ein Restnetzwerk mit TFLearn
Erstellen Sie eine Webanwendung mit Django
Machen Sie einen Filter mit einer Django-Vorlage
Befehle beim Erstellen von SNS mit Django
Erstellen Sie einen Poisson-Stepper mit numpy.random
Erstellen Sie mit Django einen LINE-Bot
Erstellen Sie eine Windows Python-Ausführungsumgebung mit VScode + Remote WSL
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)
Erstellen Sie mit Python + Qt (PySide) einen Farbwähler für das Farbrad.
Erstellen Sie mit Vagrant (Ubuntu 16.04) eine Umgebung für Django x Apache x mod_wsgi.
Ich habe eine Entwicklungsumgebung für Django 3.0 mit Docker, Docker-Compose und Poetry erstellt
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Erstellen Sie ein USB-Boot-Ubuntu mit einer Python-Umgebung für die Datenanalyse
Erstellen Sie eine CP932-CSV-Datei für Excel mit Chalice und geben Sie sie zurück
[DynamoDB] [Docker] Erstellen Sie mit Docker-Compose eine Entwicklungsumgebung für DynamoDB und Django
Programmierung für Menschen mit einem genau definierten __repr__
Komponieren Sie mit einem neuronalen Netzwerk! Führen Sie Magenta aus
Erstellen Sie mit Class einen Python-Funktionsdekorator
Erstellen Sie eine RESTful-API mit dem Django Rest Framework
Einfacher RSS-Reader mit Django
Erstellen Sie mit Python + PIL ein Dummy-Image.
Erstellen wir eine virtuelle Umgebung für Python
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe