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
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
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)
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)
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>
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.)
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)
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)
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)
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)
Ultimative Einfachheit. Wie wäre es mit einer gemeinsamen Aufgabe per Knopfdruck?
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.
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 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.
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.
--Taktschalter für Eingabe-> Kippschalter, Sensoreingang usw.
Es gibt verschiedene Möglichkeiten!
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.