[PYTHON] Einfacher Netzwerkbetrieb durch Verbindung von Cisco DNA Center und Taktschalter

Einführung

Dieser Artikel wurde von Cisco-Freiwilligen als Tag 8 des Adventskalenders 2019 von Cisco Systems Japan veröffentlicht.

Ausgabe --2017: https://qiita.com/advent-calendar/2017/cisco Ausgabe --2018: https://qiita.com/advent-calendar/2018/cisco Ausgabe --2019: https://qiita.com/advent-calendar/2019/cisco

Was möchten Sie tun?

Was ist das?

Abschlusszeichnung

IMG_1322.JPG

Taktschalter für den Betrieb

IMG_1323.JPG

Logische Konfiguration

SS 2019-12-08 0.19.26.png

Demo und Kommentar

  1. Switch Port Shut / No Shut (Beleuchtung aus / ein über PoE)
  2. Ändern Sie die VLAN-Einstellung des Switch-Ports (99 oder 1).
  3. Gleichzeitige Sicherung der Switch-Konfiguration auf dem FTP-Server
  4. (Bonus) Benachrichtigung, dass wir gerade arbeiten

Demo-Video

0:16 Demo1: Schnittstelle Shut / No Shut ... LED Aus / Ein bei PoE Shut / No Shut 0:51 Demo2: Vlan-Wechsel ... Wechsel zwischen Vlan99 und Vlan1 2:00 Demo3: Konfigurationssicherung ... Sicherung der Switch-Konfiguration auf dem FTP-Server 3:27 Demo4: Benachrichtigung an SNS ... Arbeitsbenachrichtigungen an WebEx-Teams senden

Einstellungen, Skripte

Raspberry Pi

Sieben Python-Skripte sind auf Raspai verfügbar. Eine (template_switch.py) dient zum Akzeptieren der Eingabe jeder Schaltfläche und zum Ausführen eines der sechs Skripte. Der Rest des Skripts verweist je nach Verwendungszweck auf die Cisco DNA Center-API (nur ein Beitrag wird direkt an WebEx-Teams gesendet).


pi@raspberrypi:~/code $ uname -a
Linux raspberrypi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l GNU/Linux
pi@raspberrypi:~/code $ ls -la
Insgesamt 36
drwxr-xr-x 2 root root 4096 7. Dezember 03:11 .
drwxr-xr-x 21 pi pi 4096 6. Dezember 01:29 ..
-rwxr-xr-x 1 Wurzel Wurzel 845 6. Dezember 01:30 teams.py
-rwxr-xr-x 1 root root 1285 5. Dezember 23:08 templateConfigbackup.py
-rwxr-xr-x 1 Wurzel Wurzel 1246 4. Dezember 04:42 templateNoShut.py
-rwxr-xr-x 1 Wurzel Wurzel 1243 4. Dezember 04:41 templateShut.py
-rwxr-xr-x 1 Wurzel Wurzel 1369 6. Dezember 00:45 templateVlan1.py
-rwxr-xr-x 1 Wurzel Wurzel 1370 6. Dezember 00:46 templateVlan99.py
-rwxr-xr-x 1 Wurzel Wurzel 1894 6. Dezember 06:22 template_switch.py

Verbinden Sie die sechs Tasten (Tact Switch) zwischen den sechs GPIOs (Allzweck-Ein- / Ausgang) und GND und verbinden Sie dann die folgenden Ermöglicht die Annahme von Eingaben durch den Code in. Suchen Sie für die Pin-Platzierung entsprechend oder folgen Sie der Modellnummer von Raspeye. Referenz: Raspberry Pi 2/3 B Pin Layout (40 Pins)

IMG_1266.jpg

template_switch.py


# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
import sys
import os

if __name__ == "__main__":
    pin1 = 11
    pin2 = 13
    pin3 = 15
    pin4 = 29
    pin5 = 31
    pin6 = 37

    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(pin1, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.setup(pin2, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.setup(pin3, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.setup(pin4, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.setup(pin5, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.setup(pin6, GPIO.IN, pull_up_down = GPIO.PUD_UP)

    print("Warten auf Knopf...")
    print("-- 6(noshut) - 5(shut) - 4(vlan1) - 3(vlan99) - 2(backup) - 1(message) --")

    while True:
        button1 = GPIO.input(pin1)
        button2 = GPIO.input(pin2)
        button3 = GPIO.input(pin3)
        button4 = GPIO.input(pin4)
        button5 = GPIO.input(pin5)
        button6 = GPIO.input(pin6)

        cmd = ""
        if button1 == False:
            print("Bottun1 - teams.py")
            cmd = "python ./teams.py '##Ich arbeite gerade daran##'"

        elif button2 == False:
            print("Button2 - templateConfigbackup.py")
            cmd = "python ./templateConfigbackup.py"

        elif button3 == False:
            print("Button3 - templateVlan99.py")
            cmd = "python ./templateVlan99.py"

        elif button4 == False:
            print("Button4 - templateVlan1.py")
            cmd = "python ./templateVlan1.py"

        elif button5 == False:
            print("Button5 - templateShut.py")
            cmd = "python ./templateShut.py"

        elif button6 == False:
            print("Button6 - templateNoShut.py")
            cmd = "python ./templateNoShut.py"

        if cmd != "":
            ret = os.popen(cmd).readline().strip()
            print(ret)
            time.sleep(1)

        time.sleep(0.1)

    GPIO.cleanup()

Cisco DNA Center Das Zielgerät (in diesem Beispiel zwei Catalyst 9300) muss beim Cisco DNA Center vorregistriert sein. (Verfahren weggelassen)

  1. Template Editor Registrieren Sie die Cisco IOS-CLI mithilfe der Vorlageneditorfunktion in der Benutzeroberfläche des Cisco DNA Center. Variablen, die Sie dynamisch vervollständigen möchten, können als Variablen behandelt werden, indem ihnen ein Dollarzeichen ($) vorangestellt wird. Sie können zur Laufzeit mit einem Skript oder einer GUI vervollständigt werden.

1. Schnittstelle geschlossen / nicht geschlossen

SS 2019-12-08 0.40.21.png

2. Vlan ändern

SS 2019-12-08 0.39.59.png

3. Kopieren Sie die Konfiguration auf den Dateiserver

SS 2019-12-08 0.41.07.png

4. Archivieren Sie mit der Konfigurationsarchivfunktion

SS 2019-12-08 0.43.10.png

* IOS-XE-Einstellungen für das Konfigurationsarchiv erforderlich

archive
 log config
  logging enable
  logging size 1000
  notify syslog contenttype plaintext
  hidekeys
 path ftp://<ipaddress>/ConfigBackup/Cat9300_demo1
!
ip ftp username <ftpusername>
ip ftp password <ftppassword>

Cisco DNA Center API und Python Script

Wir werden die API "Vorlage bereitstellen" aus verschiedenen Typen verwenden. Im folgenden Skriptbeispiel ist es aus Gründen der Übersichtlichkeit in einem Beispiel enthalten, z. B. Token-Erfassung und Pfadgenerierung. (Normalerweise denke ich, dass Dateien aus Gründen der Effizienz und Wartbarkeit separat importiert werden sollten.)

SS 2019-12-08 0.53.28.png

1. Port schließen / nicht schließen

templateNoShut.py


import requests
import json

DNAC_URL = 'https://<dnac_ip_address>/api'
DNAC_USER = '<username>'
DNAC_PASSWORD = '<password>'

def get_token(url, user, password):
    api_call = '/system/v1/auth/token'
    url += api_call
    response = requests.post(url=url, auth=(user, password), verify=False).json()
    return response["Token"]

def deploy(token):
    headers = {
        'X-Auth-Token': token,
        'content-type': 'application/json'
        }
    url = "https://<dnac_ip_address>/api/v1/template-programmer/template/deploy"
    
    payload = {
        "templateId": "<template_id>",
        "forcePushTemplate": "true",
        "targetInfo": [
            {
                #Da es nur einen Port gibt, an den die LED angeschlossen ist, gibt dieses Skript nur einen Switch an.
                "id": "<device_ip>",
                #Die Parameterspezifikation wechselt hier zwischen geschlossen und nicht geschlossen.
                "params": {
                    "shutnoshut": "no shut"
                },
                "type": "MANAGED_DEVICE_IP"
            }
        ],
        }

    response = requests.post(url=url, data=json.dumps(payload), headers=headers, verify=False)
    print(response)

if __name__ == '__main__':
    token = get_token(DNAC_URL, DNAC_USER, DNAC_PASSWORD)
    deploy(token)

2. Vlan ändern

templateVlan99.py


import requests
import json

DNAC_URL = 'https://<dnac_ip_address>/api'
DNAC_USER = '<username>'
DNAC_PASSWORD = '<password>'
#Mit der Einstellung mehrerer Einheiten führen wir in diesem Beispiel zwei Einheiten aus
ips = ["<ip_address_1>", "<ip_address_2>"]

def get_token(url, user, password):
    api_call = '/system/v1/auth/token'
    url += api_call
    response = requests.post(url=url, auth=(user, password), verify=False).json()
    return response["Token"]

def deploy(token, ipaddr):
    headers = {
        'X-Auth-Token': token,
        'content-type': 'application/json'
        }
    url = "https://<dnac_ip_address>/api/v1/template-programmer/template/deploy"
    
    payload = {
        "templateId": "<template_id>",
        "forcePushTemplate": "true",
        "targetInfo": [
            {
                "id": ipaddr, 
                #Wenn die Vorlage mehrere Variablen enthält, geben Sie diese auch hier an.
                #Der Wert von Vlan und der Schnittstellenname werden angegeben.
                "params": {
                    "vlan": "99",
                    "interface": "range GigabitEthernet 1/0/6-10"
                },
                "type": "MANAGED_DEVICE_IP"
            }
        ],
        }

    response = requests.post(url=url, data=json.dumps(payload), headers=headers, verify=False)
    print(response)

if __name__ == '__main__':
    token = get_token(DNAC_URL, DNAC_USER, DNAC_PASSWORD)
    for ip in ips:  
        deploy(token, ip)

3. Kopieren Sie die IOS-Konfiguration auf den Dateiserver

templateConfigbackup.py


import requests
import json

DNAC_URL = 'https://<dnac_ip_address>/api'
DNAC_USER = '<username>'
DNAC_PASSWORD = '<password>'
#Mit der Einstellung mehrerer Einheiten führen wir in diesem Beispiel zwei Einheiten aus
ips = ["<ip_address_1>", "<ip_address_2>"]

def get_token(url, user, password):
    api_call = '/system/v1/auth/token'
    url += api_call
    response = requests.post(url=url, auth=(user, password), verify=False).json()
    return response["Token"]

def deploy(token, ipaddr):
    headers = {
        'X-Auth-Token': token,
        'content-type': 'application/json'
        }
    url = "https://10.71.130.53/api/v1/template-programmer/template/deploy"
    
    payload = {
        #Dies ist das einfachste Muster in der Vorlage, das keine Variablen verarbeitet.
        #Wir haben zwei Arten von Konfigurationssicherungsmethoden vorbereitet und demonstrieren sie.
        #"templateId": "<template_id_1>",
        "templateId": "<template_id_2>",
        "forcePushTemplate": "true",
        "targetInfo": [
            {
                "id": ipaddr,
                "type": "MANAGED_DEVICE_IP"
            }
        ],
        }

    response = requests.post(url=url, data=json.dumps(payload), headers=headers, verify=False)
    print(response)

if __name__ == '__main__':
    token = get_token(DNAC_URL, DNAC_USER, DNAC_PASSWORD)
    for ip in ips: 
        deploy(token, ip)

4. Nachrichtenbenachrichtigung an das WebEx-Team

Ich bin erschöpft und sende nur eine feste Nachricht. Auf Knopfdruck führt jemand viele Kommunikationsprüfungen durch, dokumentiert die Ergebnisse und veröffentlicht sie ...

teams.py


# -*- coding: utf-8 -*-
import requests
import sys

ACCESS_TOKEN = "<access_token>"
ROOM_ID = "<room_id>"
YOUR_MESSAGE = sys.argv[1]

#Header-Erstellung
def setHeaders():
    accessToken_hdr = 'Bearer ' + ACCESS_TOKEN
    spark_header = {'Authorization': accessToken_hdr, 'Content-Type': 'application/json; charset=utf-8'}
    return spark_header

#Poste eine Nachricht in das Feld
def postMsg(the_header,roomId,message):
    message = '{"roomId":"' + roomId + '","text":"' + message +'"}'
    uri = 'https://api.ciscospark.com/v1/messages'
    resp = requests.post(uri, data=message, headers=the_header)
    print resp

header=setHeaders()
postMsg(header,ROOM_ID,YOUR_MESSAGE)

Zusammenfassung

Operation, die jeder machen kann

Ultimative Einfachheit. Wie wäre es mit einer gemeinsamen Aufgabe per Knopfdruck?

Geeignet / ungeeignet für die Verwendung des Controllers

Wenn Sie über einen Taktschalter eine Verbindung zu Ansible herstellen oder direkt über Netconf / Restconf auf das Gerät zugreifen, benötigen Sie kein Cisco DNA Center. Wenn Sie über eine kleine Anzahl von Geräten verfügen oder der Inhalt der Vorlage stark an lokale Vorgänge angepasst ist, möchten Sie möglicherweise keinen Controller.

Auf der anderen Seite möchten Personen, die in erster Linie nicht für Netzwerke verantwortlich sind, wie z. B. eine große Anzahl von Switches (Hunderte), den Unterschied in der Funktionsweise jedes Geräts mit einem Skript nicht ausgleichen, keine Skalierbarkeit und Verfügbarkeit mit einem Skriptausführungsserver usw. gewährleisten. Wenn Sie Netzwerkvorgänge mit Anwendungen verknüpfen möchten oder in solchen Fällen, ist es besser, einen Controller zu haben.

Für eine Vielzahl von ebenen Bereichen (gesamtes LAN, gesamtes DC usw.) über den Controller und für Bereiche mit vielen lokalen und benutzerdefinierten Vorgängen (z. B. HQ-WAN-Verbindung) direkt ohne Durchlaufen des Controllers. Es ist gut, es richtig zu benutzen. Sie werden von der Mühe befreit, über Wartung und Betrieb des Spielbuchs nachzudenken.

Einfaches und verallgemeinertes Skript

Wussten Sie durch das Beispielskript, dass die Handhabung von Netzwerkgeräten verborgen ist? Es wurde bestätigt, dass das, was auf Seite 15 der Folie unten gesagt wurde, bis zu einem gewissen Grad auch bei sehr vertrauten Vorgängen (Schließen / kein Schließen, VLAN-Wechsel usw.) realisiert wurde.

[Interop Tokyo 2016] Einführung des SDN-Controllers APIC-EM für LAN / WAN

Natürlich hat sich die Funktionalität selbst zu einer Absichtsorientierten entwickelt, und in Bezug auf das Cisco DNA Center geben APIs wie Assurance, SD-Access und Application Policy Ihnen einen Eindruck von der Zukunft.

Cisco DNA Center-Vorlageneditor

Cisco DNA Center ist eine Netzwerkverwaltungsplattform, die als absichtsbasierter Richtliniencontroller + Datenplattform positioniert ist. Sie kann jedoch auch als Makrocontroller verwendet werden, der die Konfiguration (CLI) ändert, die kontinuierlich wie der Vorlageneditor verwendet wird. Aus einem übergeordneten Skript oder einer anderen Anwendung geht hervor, dass allgemeine Aufgaben automatisiert werden können, indem eine Verknüpfung mit der CLI-Vorlage hergestellt und die API aufgerufen wird.

Software, Hardware, API, Netzwerktechniker

Obwohl es möglich ist, alles mit Software zu tun, werden es viele Netzwerk-Shops lieben, weil sie der Hardware nicht entkommen können. Es muss eine Zeit gegeben haben, in der alle von der Verkabelung zum Rack begeistert waren. Andererseits wurde es zu einer wichtigen Aufgabe, das Netzwerk und das obere System mithilfe der API der vollständig offenen Netzwerkinfrastruktur zu verbinden und die Automatisierung mithilfe der API mit einem anderen System zu verbinden. .. Netzwerktechniker, die Hardware, Software und Geschäftsanwendungen verbinden können, sollten eine glänzende Zukunft haben.

Es war also eine gute Pause, ab und zu mit dem Steckbrett und dem Überbrückungskabel zu spielen.

Anwendung

--Taktschalter für Eingabe-> Kippschalter, Sensoreingang usw.

Es gibt verschiedene Möglichkeiten!

Was ich benutzt habe

Referenz-URL, Buch

Haftungsausschluss

Die auf dieser Website geäußerten Meinungen und die entsprechenden Kommentare sind die persönlichen Meinungen des Posters und nicht die Meinungen von Cisco. Der Inhalt dieser Website dient nur zu Informationszwecken und darf nicht von Cisco oder einer anderen Partei unterstützt oder zum Ausdruck gebracht werden. Durch das Posten auf dieser Website ist jeder Benutzer allein für den Inhalt aller veröffentlichten, verknüpften oder anderweitig hochgeladenen Informationen verantwortlich und schließt Cisco von jeglicher Haftung für die Nutzung dieser Website aus. Genau.

Recommended Posts

Einfacher Netzwerkbetrieb durch Verbindung von Cisco DNA Center und Taktschalter
Ich habe eine einfache Netzwerkkamera hergestellt, indem ich ESP32-CAM und RTSP kombiniert habe.
Einfache Theorie und Implementierung des neuronalen Netzes