Kürzlich dreht sich in meinem Artikel alles um pyATS
Eine von Cisco entwickelte Python-Bibliothek zur Überprüfung. Bitte brechen Sie die Details ... Für Details ↓ Offizielles Dokument Mein Einführungsartikel In jüngster Zeit wurde über Qiita gesprochen, insbesondere im Bereich Automatisierung (glaube ich).
Was ich erstellt habe ist, dass die vorbereitete Konfiguration korrekt in das Zielgerät eingegeben wird. Das Eingabeergebnis wird als Unterschied in show running-config angezeigt, und die von genie learn erfasste strukturierte Ausgabe ist Diffed, um den Unterschied auf leicht verständliche Weise anzuzeigen. Dieses Mal soll es vor dem Start zur Konfiguration zurückkehren.
├── check_acl.py ← Skriptkörper
├── testbed
│ └── devnet_always.yml ← Testbed
└── vars
├── csr1000v-1.yml ← Vars of Node im Testbed beschrieben
├── iosxr1.yml
└── sbx-n9kv-ao.yml
testbed Eine Datei, die Informationen zum Verbindungsziel enthält. Bereiten Sie diesmal Folgendes vor Diese Erklärung ist übrigens vorheriger Artikel. Lassen Sie sie daher bitte weg.
devnet_always.yml
---
testbed:
name: SandBox
devices:
sbx-n9kv-ao:
alias: uut
credentials:
default:
username: admin
password: Admin_1234!
connections:
vty:
protocol: ssh
ip: sbx-nxos-mgmt.cisco.com
port: 8181
os: nxos
type: nxos
iosxr1:
alias: rt
credentials:
default:
username: admin
password: C1sco12345
connections:
vty:
protocol: ssh
ip: sbx-iosxr-mgmt.cisco.com
port: 8181
os: iosxr
type: iosxr
csr1000v-1:
alias: xe1
credentials:
default:
username: developer
password: C1sco12345
connections:
vty:
protocol: ssh
ip: ios-xe-mgmt-latest.cisco.com
port: 8181
os: iosxe
type: iosxe
csr1000v:
alias: xe0
credentials:
default:
username: developer
password: C1sco12345
connections:
vty:
protocol: ssh
ip: ios-xe-mgmt.cisco.com
port: 8181
os: iosxe
type: iosxe
Um den Inhalt zu erläutern, ist "Befehl" die Konfiguration, die zur Eingabe der Einstellungen erforderlich ist, und "Löschen" die Konfiguration, die zum Wiederherstellen der Einstellungen erforderlich ist.
StaticRoute und ACL zu csr1000v-1 von IOSXE hinzugefügt
csr1000v-1.yml
---
command: |
ip route 8.8.8.8 255.255.255.255 GigabitEthernet1 10.10.20.254
ip access-list extended TEST
permit ip any 8.8.8.8 0.0.0.0 log
remark ****TEST****
clear: |
no ip route 8.8.8.8 255.255.255.255 GigabitEthernet1 10.10.20.254
no ip access-list extended TEST
IOSXR iosxr1 bereitet nur Dateien vor und der Inhalt ist leer.
iosxr1.yml
---
command: |
clear: |
Vars von csr1000v im Testbed sind nicht vorbereitet. Als nächstes werde ich mein eigenes Skript vorstellen. Es ist in Python geschrieben. Hässlich, cool! Bitte lassen Sie mich wissen, wenn Sie das spüren, da ich es nicht für geschäftliche Zwecke, sondern zur Überprüfung verwende Für knusprige Programmierer mag es wie ein beschissener Code erscheinen, aber bitte verzeihen Sie mir. Script
check_acl.py
import logging
import yaml
#Genie-Modul importieren
from genie.conf import Genie
from genie.utils.diff import Diff
class setupDevices(object):
def __init__(self):
#Zum Speichern des Geräts
self.listDevice = list()
#running-Zum Speichern der Konfiguration
self.beforeConfig = list()
self.afterConfig = list()
#Speichert nur Geräte mit VAR-Dateien
self.targetDevice = list()
self.config = dict()
#Zum Routing von Speicher
self.beforeRouting = list()
self.afterRouting = list()
#Zur Aufbewahrung von acl
self.beforeAcl = list()
self.afterAcl = list()
#Prüfstand initialisieren
try:
self.testbed = Genie.init('testbed/devnet_always.yml')
if self.testbed :
logging.info('testbed init:OK')
for keys in self.testbed.devices:
self.listDevice.append(keys)
except TypeError:
logging.warning("Testbed-Datei ist falsch")
#Überprüfen Sie, ob eine Var-Datei vorhanden ist
for device in self.listDevice:
try:
with open('vars/{}.yml'.format(device), 'r') as yml:
device_config = { device + "_config" :yaml.safe_load(yml)}
self.config.update(device_config)
self.targetDevice.append(device)
except FileNotFoundError:
logging.warning("{}Datei nicht".format(device))
continue
#Geben Sie den Anmeldevorgang ein
self.login()
#Einloggen
def login(self):
logging.info("*"*32 + "Einloggen" + "*"*32)
for device in self.targetDevice:
self.testbed.devices[device].connect(log_stdout=False)
if self.testbed.devices[device].is_connected():
logging.info("{}: connected".format(device))
else:
logging.info("{}: disconnected".format(device))
#Pre-Log-Erfassung
def getBeforeAcl(self):
logging.info("*"*32 + "Bestätigung vor der ACL" + "*"*32)
for device in self.targetDevice:
self.beforeAcl.append(self.testbed.devices[device].learn('acl'))
logging.info("{}: beforeAcl get".format(device))
def getBeforeConfig(self):
logging.info("*"*32 + "Pre-Log-Erfassung"+ "*"*32)
for device in self.targetDevice:
self.beforeConfig.append(self.testbed.devices[device].learn('config'))
logging.info("{}: beforeConfig get".format(device))
def getBeforeRoute(self):
logging.info("*"*32 + "Vorherige Bestätigung der Routing-Tabelle" + "*"*32)
for device in self.targetDevice:
self.beforeRouting.append(self.testbed.devices[device].learn('routing'))
logging.info("{}: beforeRouting get".format(device))
#Konfigurationseingabe
def inputConfig(self):
logging.info("*"*32 + "Konfigurationseingabe" + "*"*32)
for device in self.targetDevice:
self.testbed.devices[device].configure(self.config[device+"_config"]['command'])
logging.info("{}: input_config".format(device))
#Löschen Sie die Eingabe Config
def claerConfig(self):
logging.info("*"*32 + "Zurück konfigurieren" + "*"*32)
for device in self.targetDevice:
self.testbed.devices[device].configure(self.config[device+"_config"]['clear'])
logging.info("{}: clear_config".format(device))
#Post-Log-Erfassung
def getAfterConfig(self):
logging.info("*"*32 + "Post-Log-Erfassung" + "*"*32)
for device in self.targetDevice:
self.afterConfig.append(self.testbed.devices[device].learn('config'))
logging.info("{}: afterConfig get".format(device))
def getAfterAcl(self):
logging.info("*"*32 + "Bestätigung nach der ACL" + "*"*32)
for device in self.targetDevice:
self.afterAcl.append(self.testbed.devices[device].learn('acl'))
logging.info("{}: afterAcl get".format(device))
def getAfterRoute(self):
logging.info("*"*32 + "Nachfolgende Bestätigung der Routing-Tabelle" + "*"*32)
for device in self.targetDevice:
self.afterRouting.append(self.testbed.devices[device].learn('routing'))
logging.info("{}: afterRouting get".format(device))
#Ausloggen
def logout(self):
logging.info("*"*32 + "Ausloggen" + "*"*32)
for device in self.targetDevice:
self.testbed.devices[device].disconnect()
if self.testbed.devices[device].is_connected():
logging.info("{}: connected".format(device))
else:
logging.info("{}: disconnected".format(device))
#Diff Config
def diffConfig(self):
logging.info("*"*32 + "Diff" + "*"*32)
if self.beforeConfig and self.afterConfig:
for config_b,config_a,device in zip(self.beforeConfig,self.afterConfig,self.self.targetDevice):
config_diff = Diff(config_b,config_a)
config_diff.findDiff()
print("\n====={}_ConfigDiff=====".format(device))
print(config_diff)
if self.beforeRouting and self.afterRouting:
for config_b,config_a,device in zip(self.beforeRouting,self.afterRouting,self.self.targetDevice):
config_diff = Diff(config_b,config_a)
config_diff.findDiff()
print("\n====={}_RouteDiff=====".format(device))
print(config_diff)
if self.beforeAcl and self.afterAcl:
for config_b,config_a,device in zip(self.beforeAcl,self.afterAcl,self.self.targetDevice):
config_diff = Diff(config_b,config_a)
config_diff.findDiff()
print("\n====={}_AclDiff=====".format(device))
print(config_diff)
if __name__ == "__main__":
#Ändern Sie die Protokollebene in "Info"
logging.basicConfig(level=logging.INFO)
logging.info("*"*32 + "Starten Sie die Verarbeitung" + "*"*32)
devnet = setupDevices()
devnet.getBeforeConfig()
devnet.getBeforeRoute()
devnet.getBeforeAcl()
devnet.inputConfig()
devnet.getAfterConfig()
devnet.getAfterRoute()
devnet.getAfterAcl()
devnet.claerConfig()
devnet.logout()
devnet.diffConfig()
logging.info("*"*32 + "Ende" + "*"*32)
Wenn Sie alles auf einmal einfügen, wird das Protokoll langweilig, daher erkläre ich es in kleinen Stücken.
Führen Sie das Skript mit python check_acl.py
aus.
Die Testbed-Datei wird beim Start als Prozess gelesen. Lesen Sie als Nächstes die Datei Gerätename + _config.yml im Testbed. Wenn zu diesem Zeitpunkt die Ziel-Yaml-Datei nicht vorhanden ist, wird die Meldung "Es gibt keine XX-Datei" angezeigt.
(nw_automate) 00:26:33 my Script $python check_acl.py
INFO : ********************************Starten Sie die Verarbeitung********************************
INFO : testbed init:OK
WARNING : sbx-n9kv-keine ao Datei
WARNING :Keine csr1000v-Datei
Als nächstes folgt der Anmeldevorgang.
Melden Sie sich mit Geräte [Gerät] .connect (log_stdout = False)
an.
Zu diesem Zeitpunkt wird das Protokoll bei der Anmeldung nicht angezeigt, da "log_stdout = False" angegeben ist.
INFO : ********************************Einloggen********************************
INFO : iosxr1: connected
INFO : csr1000v-1: connected
Nach dem Anmelden erhalten Sie verschiedene Vorprotokolle. Nach der Erfassung werden verschiedene Vorzustände in der Liste gespeichert.
Elemente, die Sie überprüfen möchten | Ops, die erhalten werden können |
---|---|
RunningConfig | device['Gerätename'].learn('config') |
ACL | device['Gerätename'].learn('acl') |
Routing | device['Gerätename'].learn('routing') |
INFO : ********************************Pre-Log-Erfassung********************************
INFO : iosxr1: beforeConfig get
INFO : csr1000v-1: beforeConfig get
INFO : ********************************Vorherige Bestätigung der Routing-Tabelle********************************
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_routing.ShowRouteIpv6Distributor'> 'genie.libs.parser.iosxr.show_routing.ShowRouteIpDistributor'> 'genie.libs.parser.iosxr.show_routing.ShowRouteIpv6Distributor'>
INFO : iosxr1: beforeRouting get
INFO : Could not learn <class 'genie.libs.parser.iosxe.show_routing.ShowIpv6RouteDistributor'>
'genie.libs.parser.iosxe.show_routing.ShowIpRouteDistributor'> 'genie.libs.parser.iosxe.show_routing.ShowIpv6RouteDistributor'>
INFO : csr1000v-1: beforeRouting get
INFO : ********************************Bestätigung vor der ACL********************************
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_acl.ShowAclAfiAll'>
Parser Output is empty
INFO : Could not learn <class'genie.libs.parser.iosxr.show_acl.ShowAclEthernetServices'>
INFO : | Commands for learning feature 'Acl'
INFO : | - Commands with empty output
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_acl.ShowAclAfiAll'>
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_acl.ShowAclEthernetServices'>
INFO : iosxr1: beforeAcl get
INFO : | Commands for learning feature 'Acl'
INFO : | cmd: <class 'genie.libs.parser.iosxe.show_acl.ShowAccessLists'>
INFO : csr1000v-1: beforeAcl get
Senden Sie als Nächstes die in [Befehl]
der Vars-Datei beschriebene Konfiguration.
Nach der Eingabe entspricht das Nachprotokoll dem zuvor erstellten Protokoll. (Kürzung···)
INFO : ********************************Konfigurationseingabe********************************
INFO : iosxr1: input_config
INFO : csr1000v-1: input_config
INFO : ********************************Post-Log-Erfassung********************************
INFO : iosxr1: afterConfig get
INFO : csr1000v-1: afterConfig get
INFO : ********************************Nachfolgende Bestätigung der Routing-Tabelle********************************
Nach dem Abrufen des Nachprotokolls wird auch die Konfiguration wiederhergestellt.
Kehren Sie mit dem in clear
der vars-Datei beschriebenen Inhalt zurück.
Danach melden Sie sich ab. Nach dem Abmelden wird der aktuelle Verbindungsstatus überprüft und der Status angezeigt.
INFO : ********************************Zurück konfigurieren********************************
INFO : iosxr1: clear_config
INFO : csr1000v-1: clear_config
INFO : ********************************Ausloggen********************************
INFO : iosxr1: disconnected
INFO : csr1000v-1: disconnected
Schließlich Diff die erhaltenen Pre-Confgi und Post-Config. Am Anfang des Satzes steht ein + oder-Zeichen.
Zum Beispiel zeigt configDiff in iosxr1 die Hierarchie gut an. Ist das nicht viel einfacher zu verstehen als nur Texte zu vergleichen?
INFO : ********************************Diff********************************
=====iosxr1_ConfigDiff=====
+Wed Dec 18 16:57:14.949 UTC:
-Wed Dec 18 16:56:58.216 UTC:
router static:
address-family ipv4 unicast:
+ 8.8.8.8/32 10.10.20.254:
=====csr1000v-1_ConfigDiff=====
+Current configuration : 7620 bytes:
+ip route 8.8.8.8 255.255.255.255 GigabitEthernet1 10.10.20.254:
-Current configuration : 7557 bytes:
=====iosxr1_RouteDiff=====
info:
vrf:
default:
address_family:
ipv4:
routes:
+ 8.8.8.8/32:
+ active: True
+ metric: 0
+ next_hop:
+ next_hop_list:
+ 1:
+ index: 1
+ next_hop: 10.10.20.254
+ updated: 00:00:08
+ route: 8.8.8.8/32
+ route_preference: 1
+ source_protocol: static
+ source_protocol_codes: S
=====csr1000v-1_RouteDiff=====
info:
vrf:
default:
address_family:
ipv4:
routes:
+ 8.8.8.8/32:
+ active: True
+ metric: 0
+ next_hop:
+ next_hop_list:
+ 1:
+ index: 1
+ next_hop: 10.10.20.254
+ outgoing_interface: GigabitEthernet1
+ route: 8.8.8.8/32
+ route_preference: 1
+ source_protocol: static
+ source_protocol_codes: S
=====iosxr1_AclDiff=====
=====csr1000v-1_AclDiff=====
INFO : ********************************Ende********************************
Es tut mir leid, dass der Artikel schwer zu lesen war, da es sich nur um Code handelte. Wie Sie jedoch aus den Diff-Ergebnissen ersehen können, war die Bestätigung einfach.
Ich habe Python sehr hart geschrieben, aber tatsächlich kann ich das Gleiche tun, ohne Code zu schreiben. Ich werde eine Referenz-URL posten. PyATS | Erstellen eines Hochgeschwindigkeits-Automatisierungstests mit Genies verstecktem Spezialzug Blitz [Überprüfen Sie problemlos Netzwerke von mehreren Anbietern mit pyATS / Genie und Robot Framework] (https://qiita.com/tahigash/items/ceb0809a4a9464c521b3)
Ich habe diesen Code nicht von Grund auf neu geschrieben, aber es ist mir gelungen, die Informationen im Internet zu sammeln und in Form zu bringen. Auf Github gibt es viele hilfreiche Codes namens CiscoTestAutomation.
Alle Protokolle dieses Mal ausgeführt
(nw_automate) 00:26:33 my Script $python check_acl.py
INFO : ********************************Starten Sie die Verarbeitung********************************
INFO : testbed init:OK
WARNING : sbx-n9kv-keine ao Datei
WARNING :Keine csr1000v-Datei
INFO : ********************************Einloggen********************************
INFO : iosxr1: connected
INFO : csr1000v-1: connected
INFO : ********************************Pre-Log-Erfassung********************************
INFO : iosxr1: beforeConfig get
INFO : csr1000v-1: beforeConfig get
INFO : ********************************Vorherige Bestätigung der Routing-Tabelle********************************
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_routing.ShowRouteIpv6Distributor'>
Parser Output is empty
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Routing' |
INFO : +====================================================================================================================================================+
INFO : | - Parsed commands |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_routing.ShowRouteIpDistributor'> |
INFO : |====================================================================================================================================================|
INFO : | - Commands with empty output |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_routing.ShowRouteIpv6Distributor'> |
INFO : |====================================================================================================================================================|
INFO : iosxr1: beforeRouting get
INFO : Could not learn <class 'genie.libs.parser.iosxe.show_routing.ShowIpv6RouteDistributor'>
Parser Output is empty
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Routing' |
INFO : +====================================================================================================================================================+
INFO : | - Parsed commands |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxe.show_routing.ShowIpRouteDistributor'> |
INFO : |====================================================================================================================================================|
INFO : | - Commands with empty output |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxe.show_routing.ShowIpv6RouteDistributor'> |
INFO : |====================================================================================================================================================|
INFO : csr1000v-1: beforeRouting get
INFO : ********************************Bestätigung vor der ACL********************************
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_acl.ShowAclAfiAll'>
Parser Output is empty
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_acl.ShowAclEthernetServices'>
Parser Output is empty
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Acl' |
INFO : +====================================================================================================================================================+
INFO : | - Commands with empty output |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_acl.ShowAclAfiAll'> |
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_acl.ShowAclEthernetServices'> |
INFO : |====================================================================================================================================================|
INFO : iosxr1: beforeAcl get
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Acl' |
INFO : +====================================================================================================================================================+
INFO : | - Parsed commands |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxe.show_acl.ShowAccessLists'> |
INFO : |====================================================================================================================================================|
INFO : csr1000v-1: beforeAcl get
INFO : ********************************Konfigurationseingabe********************************
INFO : iosxr1: input_config
INFO : csr1000v-1: input_config
INFO : ********************************Post-Log-Erfassung********************************
INFO : iosxr1: afterConfig get
INFO : csr1000v-1: afterConfig get
INFO : ********************************Nachfolgende Bestätigung der Routing-Tabelle********************************
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_routing.ShowRouteIpv6Distributor'>
Parser Output is empty
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Routing' |
INFO : +====================================================================================================================================================+
INFO : | - Parsed commands |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_routing.ShowRouteIpDistributor'> |
INFO : |====================================================================================================================================================|
INFO : | - Commands with empty output |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_routing.ShowRouteIpv6Distributor'> |
INFO : |====================================================================================================================================================|
INFO : iosxr1: afterRouting get
INFO : Could not learn <class 'genie.libs.parser.iosxe.show_routing.ShowIpv6RouteDistributor'>
Parser Output is empty
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Routing' |
INFO : +====================================================================================================================================================+
INFO : | - Parsed commands |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxe.show_routing.ShowIpRouteDistributor'> |
INFO : |====================================================================================================================================================|
INFO : | - Commands with empty output |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxe.show_routing.ShowIpv6RouteDistributor'> |
INFO : |====================================================================================================================================================|
INFO : csr1000v-1: afterRouting get
INFO : ********************************Bestätigung nach der ACL********************************
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_acl.ShowAclAfiAll'>
Parser Output is empty
INFO : Could not learn <class 'genie.libs.parser.iosxr.show_acl.ShowAclEthernetServices'>
Parser Output is empty
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Acl' |
INFO : +====================================================================================================================================================+
INFO : | - Commands with empty output |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_acl.ShowAclAfiAll'> |
INFO : | cmd: <class 'genie.libs.parser.iosxr.show_acl.ShowAclEthernetServices'> |
INFO : |====================================================================================================================================================|
INFO : iosxr1: afterAcl get
INFO : +====================================================================================================================================================+
INFO : | Commands for learning feature 'Acl' |
INFO : +====================================================================================================================================================+
INFO : | - Parsed commands |
INFO : |----------------------------------------------------------------------------------------------------------------------------------------------------|
INFO : | cmd: <class 'genie.libs.parser.iosxe.show_acl.ShowAccessLists'> |
INFO : |====================================================================================================================================================|
INFO : csr1000v-1: afterAcl get
INFO : ********************************Zurück konfigurieren********************************
INFO : iosxr1: clear_config
INFO : csr1000v-1: clear_config
INFO : ********************************Ausloggen********************************
INFO : iosxr1: disconnected
INFO : csr1000v-1: disconnected
INFO : ********************************Diff********************************
=====iosxr1_ConfigDiff=====
+Wed Dec 18 16:57:14.949 UTC:
-Wed Dec 18 16:56:58.216 UTC:
router static:
address-family ipv4 unicast:
+ 8.8.8.8/32 10.10.20.254:
=====csr1000v-1_ConfigDiff=====
+Current configuration : 7620 bytes:
+ip route 8.8.8.8 255.255.255.255 GigabitEthernet1 10.10.20.254:
-Current configuration : 7557 bytes:
=====iosxr1_RouteDiff=====
info:
vrf:
default:
address_family:
ipv4:
routes:
+ 8.8.8.8/32:
+ active: True
+ metric: 0
+ next_hop:
+ next_hop_list:
+ 1:
+ index: 1
+ next_hop: 10.10.20.254
+ updated: 00:00:08
+ route: 8.8.8.8/32
+ route_preference: 1
+ source_protocol: static
+ source_protocol_codes: S
=====csr1000v-1_RouteDiff=====
info:
vrf:
default:
address_family:
ipv4:
routes:
+ 8.8.8.8/32:
+ active: True
+ metric: 0
+ next_hop:
+ next_hop_list:
+ 1:
+ index: 1
+ next_hop: 10.10.20.254
+ outgoing_interface: GigabitEthernet1
+ route: 8.8.8.8/32
+ route_preference: 1
+ source_protocol: static
+ source_protocol_codes: S
=====iosxr1_AclDiff=====
=====csr1000v-1_AclDiff=====
INFO : ********************************Ende********************************
(nw_automate) 00:28:00 my Script $
Recommended Posts