Betrieb der ACL von Cisco IOS-XE mit RESTCONF (Python-Version)

Einführung

Dies ist ein Memo beim Festlegen der ACL von Cisco IOS-XE mithilfe von RESTCONF unter den Transportprotokollen (NETCONF, RESTCONF, gRPC), die für die modellgesteuerte Programmierbarkeit verwendet werden. Es gibt Postman, Python, Ansible usw. als Operationstools, aber dieses Mal habe ich Python verwendet und CRUD (Erstellen, Abrufen, Aktualisieren, Löschen) für die benannte erweiterte ACL ausgeführt.

1. RESTCONF Übersicht

RESTCONF ist ein HTTP (S) -basiertes Protokoll, das eine RESTFul-Schnittstelle bereitstellt. Neben XML wird auch das JSON-Format als Datenformat unterstützt (NETCONF ist SSH-basiert und nur XML-Format).

RESTCONF / NETCONF CRUD-Betrieb

RESTCONF NETCONF
GET <get>, <get-config>
POST <edit-config> (operation="create")
PUT <edit-config> (operation="create/replace")
PATCH <edit-config> (operation="merge")
DELETE <edit-config> (operation="delete")

IOS unterstützt ursprünglich auch die REST-API. Während die REST-API eine herstellerspezifische Implementierung ist, ist RESTCONF ein standardisiertes Protokoll in RFC8040 und eine separate Entität.

Ein Überblick über die modellgetriebene Programmierbarkeit, einschließlich RESTCONF, wird in den folgenden Sitzungen in den DevNet Learning Labs zusammengefasst. Einführung der modellgetriebenen Programmierbarkeit

2. Vorbereitete Umgebung

[Dieser Artikel](https://qiita.com/tech_kitara/items/4c201a83f1f9286d002b#2-%E7%94%A8%E6%84%8F%E3%81%97%E3%81%9F%E7%92 Wie bei% B0% E5% A2% 83) haben wir die Cisco dCloud-Umgebung verwendet. Das verwendete Zielgerät war "CSR1000v mit IOS XE 16.08" und die Python-Version des Clients war "3.6.8".

3. Erstellen Sie eine ACL

Fügen Sie zunächst eine Zeile des ACL-Namens "TEST" aus dem Status hinzu, in dem keine ACL-Einstellung vorhanden ist.

3-1. Python-Code

Es wird eine Anforderung an die URL "https: // [IP-Adresse]: [Portnummer] / restconf / data / Cisco-IOS-XE-native: native / ip / access-list" unter Verwendung der "PUT" -Methode gestellt. Die Daten in Body werden im JSON-Format definiert. Es konnte übrigens nicht mit der POST-Methode erstellt werden.

create_acl.py


#!/usr/bin/python
import requests
import json

# disable warnings from SSL/TLS certificates
requests.packages.urllib3.disable_warnings()

# credentials for CSR1000v
HOST = '[IP Adresse]'
PORT = 443  #Kommt auf die Umwelt an
USER = '[Nutzername]'
PASS = '[Passwort]'


def main():
    # url string to issue request
    url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-native:native/ip/access-list".format(h=HOST, p=PORT)

    # RESTCONF media types for REST API headers
    headers = {'Content-Type': 'application/yang-data+json',
               'Accept': 'application/yang-data+json'}

    # RESTCONF doby for new ACL
    body_data = {
                    "Cisco-IOS-XE-native:access-list": {
                        "Cisco-IOS-XE-acl:extended": [
                            {
                                "name": "TEST",
                                "access-list-seq-rule": [
                                    {
                                        "sequence": "30",
                                        "ace-rule": {
                                            "action": "permit",
                                            "protocol": "ip",
                                            "ipv4-address": "192.168.4.0",
                                            "mask": "0.0.0.255",
                                            "dest-ipv4-address": "192.168.100.0",
                                            "dest-mask": "0.0.0.255"
                                            }
                                        }
                                    ]
                                }
                            ]
                        }
                    }

    # this statement performs a PUT on the specified url
    response = requests.put(url, auth=(USER, PASS),
                            headers=headers, data=json.dumps(body_data), verify=False)

    # print the json that is returned
    print(response)

if __name__ == '__main__':
    main()

3-2. Ausführungsergebnis

Der Statuscode 204 (kein Inhalt) wird zurückgegeben.

$ python create_acl.py
<Response [204]>

Mit Blick auf die Konfiguration wurde die ACL wie erwartet erstellt.

csr1#sh run | begin TEST
ip access-list extended TEST
 permit ip 192.168.4.0 0.0.0.255 192.168.100.0 0.0.0.255

4. Holen Sie sich ACL

Versuchen Sie als Nächstes, die Informationen der erstellten ACL mit RESTCONF abzurufen.

4-1. Python-Code (1) IP-Einstellungen abrufen

Mit Ausnahme der Funktion main () ist sie dieselbe wie in 3., daher ist das Folgende ein Auszug. Rufen Sie zunächst für die URL "https: // [IP-Adresse]: [Portnummer] / restconf / data / Cisco-IOS-XE-native: native / ip" IP-bezogene Einstellungsinformationen mit der Methode "GET" ab. Ich versuchte es.

get_ip_info.py


def main():
    # url string to issue request
    url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-native:native/ip".format(h=HOST, p=PORT)

    # RESTCONF media types for REST API headers
    headers = {'Content-Type': 'application/yang-data+json',
               'Accept': 'application/yang-data+json'}

    # this statement performs a GET on the specified url
    response = requests.get(url, auth=(USER, PASS),
                            headers=headers, verify=False)

    # print the json that is returned
    print(response.text)

4-2. Ausführungsergebnis (1) Erfassung der IP-Einstellungen

In der Mitte von "Zugriffsliste": {"Cisco-IOS-XE-acl: erweitert": [~]} "konnte ich die Einstellungen bestätigen. Übrigens wurde es vor dem Festlegen der ACL nicht mit diesem Schlüssel "Zugriffsliste" erstellt. Daher ist beim Erstellen von 3. ein Fehler aufgetreten, selbst wenn Sie plötzlich "Cisco-IOS-XE-acl: erweitert": [~] "in die untere Hierarchie eingegeben haben.

$ python get_ip_info.py
{
  "Cisco-IOS-XE-native:ip": {
    "domain": {
      "name": "demo.dcloud.cisco.com"
    },
    "forward-protocol": {
      "protocol": "nd"
    },
    "route": {
      "ip-route-interface-forwarding-list": [
        {
          "prefix": "0.0.0.0",
          "mask": "0.0.0.0",
          "fwd-list": [
            {
              "fwd": "GigabitEthernet1",
              "interface-next-hop": [
                {
                  "ip-address": "198.18.128.1"
                }
              ]
            }
          ]
        }
      ]
    },
    "ssh": {
      "rsa": {
        "keypair-name": "ssh-key"
      },
      "version": 2
    },
    "access-list": {
      "Cisco-IOS-XE-acl:extended": [
        {
          "name": "TEST",
          "access-list-seq-rule": [
            {
              "sequence": "30",
              "ace-rule": {
                "action": "permit",
                "protocol": "ip",
                "ipv4-address": "192.168.4.0",
                "mask": "0.0.0.255",
                "dest-ipv4-address": "192.168.100.0",
                "dest-mask": "0.0.0.255"
              }
            }
          ]
        }
      ]
    },
    "Cisco-IOS-XE-http:http": {
      "authentication": {
        "local": [null]
      },
      "server": true,
      "secure-server": true
    }
  }
}

4-3. Python-Code (2) Erweiterte ACL-Einstellungen abrufen

Dies ist eine tiefere Hierarchie-URL "https: // [IP-Adresse]: [Portnummer] / restconf / data / Cisco-IOS-XE-native: native / ip / Zugriffsliste / erweitert", nur erweiterte ACL Ist ein Beispiel dafür, wie man punktgenau wird.

get_acl.py


def main():
    # url string to issue request
    url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-native:native/ip/access-list/extended".format(h=HOST, p=PORT)

    # RESTCONF media types for REST API headers
    headers = {'Content-Type': 'application/yang-data+json',
               'Accept': 'application/yang-data+json'}

    # this statement performs a GET on the specified url
    response = requests.get(url, auth=(USER, PASS),
                            headers=headers, verify=False)

    # print the json that is returned
    print(response.text)

4-4 Ausführungsergebnis (2) Erfassung erweiterter ACL-Einstellungen

$ python get_acl.py
{
  "Cisco-IOS-XE-acl:extended": [
    {
      "name": "TEST",
      "access-list-seq-rule": [
        {
          "sequence": "30",
          "ace-rule": {
            "action": "permit",
            "protocol": "ip",
            "ipv4-address": "192.168.4.0",
            "mask": "0.0.0.255",
            "dest-ipv4-address": "192.168.100.0",
            "dest-mask": "0.0.0.255"
          }
        }
      ]
    }
  ]
}

5. ACL-Zusammenführung

Hier ist ein Beispiel für das Hinzufügen eines Eintrags (ACE) und das Hinzufügen einer weiteren ACL zu einer vorhandenen ACL.

5-1. Python-Code (1) Eintrag hinzufügen

Versuchen Sie, der zweiten Zeile des vorhandenen ACL-Namens "TEST" einen Eintrag hinzuzufügen. Dieses Mal wird "50" für die Sequenznummer "30" angegeben. Wenn Sie die Sequenznummer nicht angeben, können Sie sie übrigens aufgrund eines Fehlers nicht festlegen. Bei Verwendung von PATCH, einer Methode zum Zusammenführen, bleiben die vorhandenen Einstellungen unverändert, und der Inhalt des Körpers wird hinzugefügt.

merge_ace.py


def main():
    # url string to issue request
    url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-native:native/ip/access-list".format(h=HOST, p=PORT)

    # RESTCONF media types for REST API headers
    headers = {'Content-Type': 'application/yang-data+json',
               'Accept': 'application/yang-data+json'}

    # RESTCONF doby for new ACL
    body_data = {
                    "Cisco-IOS-XE-native:access-list": {
                        "Cisco-IOS-XE-acl:extended": [
                            {
                                "name": "TEST",
                                "access-list-seq-rule": [
                                    {
                                        "sequence": "50",
                                        "ace-rule": {
                                            "action": "permit",
                                            "protocol": "ip",
                                            "ipv4-address": "192.168.5.0",
                                            "mask": "0.0.0.255",
                                            "dest-ipv4-address": "192.168.100.0",
                                            "dest-mask": "0.0.0.255"
                                            }
                                        }
                                    ]
                                }
                            ]
                        }
                    }

    # this statement performs a PUT on the specified url
    response = requests.patch(url, auth=(USER, PASS),
                            headers=headers, data=json.dumps(body_data), verify=False)

    # print the json that is returned
    print(response)

5-2. Ausführungsergebnis (1) Hinzufügung eines Eintrags

Der Statuscode 204 (kein Inhalt) wird zurückgegeben.

$ python merge_ace.py
<Response [204]>

Mit Blick auf Config wurde es wie erwartet in die zweite Zeile eingefügt.

csr1#sh run | begin TEST
ip access-list extended TEST
 permit ip 192.168.4.0 0.0.0.255 192.168.100.0 0.0.0.255
 permit ip 192.168.5.0 0.0.0.255 192.168.100.0 0.0.0.255

5-3 Python-Code (2) Fügen Sie eine weitere ACL hinzu

Fügen wir nun eine weitere Zeile mit dem ACL-Namen "TEST2" hinzu.

merge_another_acl.py


def main():
    # url string to issue request
    url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-native:native/ip/access-list".format(h=HOST, p=PORT)

    # RESTCONF media types for REST API headers
    headers = {'Content-Type': 'application/yang-data+json',
               'Accept': 'application/yang-data+json'}

    # RESTCONF doby for new ACL
    body_data = {
                    "Cisco-IOS-XE-native:access-list": {
                        "Cisco-IOS-XE-acl:extended": [
                            {
                                "name": "TEST2",
                                "access-list-seq-rule": [
                                    {
                                        "sequence": "70",
                                        "ace-rule": {
                                            "action": "permit",
                                            "protocol": "ip",
                                            "ipv4-address": "192.168.7.0",
                                            "mask": "0.0.0.255",
                                            "dest-ipv4-address": "192.168.100.0",
                                            "dest-mask": "0.0.0.255"
                                            }
                                        }
                                    ]
                                }
                            ]
                        }
                    }

    # this statement performs a PUT on the specified url
    response = requests.patch(url, auth=(USER, PASS),
                            headers=headers, data=json.dumps(body_data), verify=False)

    # print the json that is returned
    print(response)

5-4 Ausführungsergebnis (2) Fügen Sie eine weitere ACL hinzu

$ python merge_another_acl.py
<Response [204]>

Sie können sehen, dass der ACL-Name "TEST2" hinzugefügt wurde.

csr1#sh run | begin TEST
ip access-list extended TEST
 permit ip 192.168.4.0 0.0.0.255 192.168.100.0 0.0.0.255
 permit ip 192.168.5.0 0.0.0.255 192.168.100.0 0.0.0.255
ip access-list extended TEST2
 permit ip 192.168.7.0 0.0.0.255 192.168.100.0 0.0.0.255

6. ACL-Ersatz

Diesmal ist dies ein Beispiel für das Überschreiben einer vorhandenen ACL und das Erstellen eines anderen ACL-Namens "TEST3". Ich denke, dies ist ein Fall, in dem normale ACL-Arbeiten grundsätzlich nicht ausgeführt werden (ein schwerer Unfall tritt auf, wenn sie unbeabsichtigt ausgeführt werden). Abgesehen von den ACL-Einstellungen kann es jedoch als deklarativer Typ definiert werden, der auf dem Parameterblatt basiert, z. B. "Die Einstellung von ... sollte XX sein". Ich denke, es besteht der Vorteil, dass es ohne den Aufwand des Löschens vorhandener Einstellungen festgelegt werden kann. Ich werde.

6-1. Python-Code

Die Methode verwendet "PUT" wie beim Erstellen eines neuen.

replace_acl.py


def main():
    # url string to issue request
    url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-native:native/ip/access-list".format(h=HOST, p=PORT)

    # RESTCONF media types for REST API headers
    headers = {'Content-Type': 'application/yang-data+json',
               'Accept': 'application/yang-data+json'}

    # RESTCONF doby for new ACL
    body_data = {
                    "Cisco-IOS-XE-native:access-list": {
                        "Cisco-IOS-XE-acl:extended": [
                            {
                                "name": "TEST3",
                                "access-list-seq-rule": [
                                    {
                                        "sequence": "90",
                                        "ace-rule": {
                                            "action": "permit",
                                            "protocol": "ip",
                                            "ipv4-address": "192.168.9.0",
                                            "mask": "0.0.0.255",
                                            "dest-ipv4-address": "192.168.100.0",
                                            "dest-mask": "0.0.0.255"
                                            }
                                        }
                                    ]
                                }
                            ]
                        }
                    }

    # this statement performs a PUT on the specified url
    response = requests.put(url, auth=(USER, PASS),
                            headers=headers, data=json.dumps(body_data), verify=False)

    # print the json that is returned
    print(response)

6-2. Ausgabeergebnis

$ python replace_acl.py
<Response [204]>

Es wurde erfolgreich überschrieben.

csr1#sh run | begin TEST
ip access-list extended TEST3
 permit ip 192.168.9.0 0.0.0.255 192.168.100.0 0.0.0.255

Übrigens, laut der Person, die den folgenden Artikel geschrieben hat, gibt es im Fall von NX-OS Fälle, in denen die PUT-Methode nicht den Spezifikationen von RFC8040 entspricht und wie die PATCH-Methode zusammengeführt wird. Exploring IOS-XE and NX-OS based RESTCONF Implementations with YANG and Openconfig

7. Löschen Sie die ACL

Versuchen Sie abschließend, die erstellte ACL zu löschen. Führen Sie "3. ACL-Erstellung" und "5. ACL-Zusammenführung" im Voraus aus, um "TEST3" zu überschreiben und "TEST" und "TEST2" zu belassen.

csr1#sh run | begin TEST
ip access-list extended TEST
 permit ip 192.168.4.0 0.0.0.255 192.168.100.0 0.0.0.255
 permit ip 192.168.5.0 0.0.0.255 192.168.100.0 0.0.0.255
ip access-list extended TEST2
 permit ip 192.168.7.0 0.0.0.255 192.168.100.0 0.0.0.255

7-1. Python-Code

Stellen Sie mit der Methode "DELETE" eine Anfrage an die URL "https: // [IP-Adresse]: [Portnummer] / restconf / data / Cisco-IOS-XE-native: native / ip / Zugriffsliste / erweitert = TEST2" Ich werde das machen. Sie können "TEST2" auf ACL-Basis löschen, indem Sie am Ende der URL "/ extended = TEST2" angeben. (Ich wusste nicht, wie ich jeden Eintrag löschen sollte.)

delete_acl.py


def main():
    # url string to issue request
    url = "https://{h}:{p}/restconf/data/Cisco-IOS-XE-native:native/ip/access-list/extended=TEST2".format(h=HOST, p=PORT)

    # RESTCONF media types for REST API headers
    headers = {'Content-Type': 'application/yang-data+json',
               'Accept': 'application/yang-data+json'}

    # this statement performs a DELETE on the specified url
    response = requests.delete(url, auth=(USER, PASS),
                            headers=headers, verify=False)

    # print the json that is returned
    print(response)

7-2. Ausführungsergebnis

$ python delete_acl.py
<Response [204]>

TEST2 wurde gelöscht.

csr1#sh run | begin TEST
ip access-list extended TEST
 permit ip 192.168.4.0 0.0.0.255 192.168.100.0 0.0.0.255
 permit ip 192.168.5.0 0.0.0.255 192.168.100.0 0.0.0.255

Schließlich

Es gab noch nicht viele Beispielcodes im Internet, also habe ich es versucht. Im vorherigen Artikel wurde ACL Config durch Kombinieren von Anforderungsmaterial und komplizierter Jinja2-Vorlage generiert. Mit RESTCONF können Parameterinformationen wie Anforderungsmaterial durch Konvertieren in das JSON-Format festgelegt werden, sodass es automatisiert wird. Ich denke es passt gut dazu. Diesmal war es ein Beispiel für Python, aber ich möchte ein Beispiel mit den Ansible-Modulen "restconf_get" und "restconf_config" zusammenfassen und erläutern, wie für jedes Einstellungselement ein Modell (URL) überprüft und erstellt wird.

Recommended Posts

Betrieb der ACL von Cisco IOS-XE mit RESTCONF (Python-Version)
Bearbeiten von EAGLE .brd-Dateien mit Python
Cisco Catalyst IOS-Python und Bash unter XE
Geräteüberwachung durch On-Box Python von IOS-XE
Erster Versuch von YDK mit Cisco IOS-XE
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Serielle Kommunikation mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
1.1 Erste Schritte mit Python
Tweets mit Python sammeln
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Tweets mit Python posten
Fahren Sie WebDriver mit Python
Verwenden Sie Mecab mit Python 3
[Python] Mit CGIHTTPServer umleiten
Sprachanalyse mit Python
Denken Sie an Yaml mit Python
Erste Schritte mit Python
Verwenden Sie DynamoDB mit Python
Zundko Getter mit Python
Behandle Excel mit Python
Ohmsches Gesetz mit Python
Primzahlbeurteilung mit Python
Führen Sie Blender mit Python aus
Löse Mathe mit Python
Python ab Windows 7