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.
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
[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".
Fügen Sie zunächst eine Zeile des ACL-Namens "TEST" aus dem Status hinzu, in dem keine ACL-Einstellung vorhanden ist.
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()
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
Versuchen Sie als Nächstes, die Informationen der erstellten ACL mit RESTCONF abzurufen.
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)
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
}
}
}
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)
$ 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"
}
}
]
}
]
}
Hier ist ein Beispiel für das Hinzufügen eines Eintrags (ACE) und das Hinzufügen einer weiteren ACL zu einer vorhandenen ACL.
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)
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
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)
$ 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
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.
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)
$ 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
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
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)
$ 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
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