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.)
** 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
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.
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.
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.
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 **
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!
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>
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()
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.
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
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:
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.
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)
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)
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.
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