Inhoud

Inleiding

Voorwaarden

Configuratie

Netwerkdiagram

Configuratieprocedure

1. Uploadtoken-id ophalen

2. VRF maken

3. Interface naar een VRF verplaatsen

4. IP-adres aan interface toewijzen

5. VRF-bewuste bgp maken

6. Definieer BGP-buur onder VRF-adresfamilie

Referenties

Gebruikte afkortingen:

Inleiding

Dit document toont het gebruik van Python-programmering aan om een MPLS L3VPN op een PoE-router (Service Provider Edge) te provisioneren met behulp van REST API. In dit voorbeeld worden Cisco CSR1000v (IOS-XE) routers als PE-routers gebruikt.

Bijdrage van: Anuradha Perera

Bewerkt door: Kumar Sridhar

Voorwaarden

- REST API-beheertoegang tot CSR1000v-routers (raadpleeg de referenties aan het eind van dit document).

- Python (Versie 2.x of 3.x) en Python-bibliotheek "Verzoeken" geïnstalleerd op de computer die wordt gebruikt voor het configureren van de routers.

- Enkele basiskennis van Python-programmering.

Configuratie

Netwerkdiagram

In dit voorbeeld ligt de nadruk op het configureren van de vereiste MPLS L3VPN-serviceparameters op de PE-1 router, die in roze kleur worden gemarkeerd.

Configuratieprocedure

De configuratietaak is verdeeld in een aantal subtaken en elke subtaak wordt geïmplementeerd onder een door de gebruiker gedefinieerde functie. Zo kunnen functies worden hergebruikt wanneer dat nodig is.

Alle functies gebruiken de bibliotheek "Verzoeken" om toegang te krijgen tot REST API's op de router en dataformaat is JSON. In HTTP verzoeken "verify" wordt parameter ingesteld op "False" om het valideren van SSL certificaat te negeren.

1. Uploadtoken-id ophalen

Alvorens met om het even welke configuratie op een router te werk te gaan moet u een geldige token-id hebben die uit de router wordt verkregen. Deze functie initieert HTTP-verzoek om een token-id te authenticeren en te verkrijgen, zodat deze andere API's kan oproepen met deze token. Het antwoord op dit verzoek omvat een token-id.

#-----------------------------------

def getToken (ip, poort, gebruikersnaam, wachtwoord):

aanvragen voor invoer

importbasis64

url = "https://" + ip + "+ poort + "/api/v1/auth/token-services"

headers = {

"content-type": "application/json",

"autorisatie": "Basic" + base64.b64encode((gebruikersnaam + ":" + wachtwoord).encode("UTF-8")).decode("ascii"),

'cache-control': "zonder cache"

}

antwoord = request.request("POST", url, headers=headers, verify=False )

indien response.status_code == 200:

return response.json()['token-id']

anders:

terugkeren "mislukt"

#-----------------------------------

2. VRF maken

Deze functie maakt de VRF op de PE-router met de vereiste routeonderscheidingsteken (RD) en import/export-routedoelen (RT)

#-----------------------------------

def creatiefVRF (ip, poort, tokenID, vrfName, RD, importRT, exportRT):

aanvragen voor invoer

url = "https://" + ip + ":"+ poort + "/api/v1/vrf"

headers = {

"content-type": "application/json",

"X-auth-token": tokenID,

'cache-control': "zonder cache"

}

gegevens = {

"naam": vrfName,

"rd": RD,

"route-doelstelling": [

{

"actie" : "invoer",

"Gemeenschap": importRT

},

{

"actie" : "uitvoer",

"gemeenschap": exportRT

}

]

}

antwoord = request.request("POST", url, headers=headers, json=data, verify=False )

indien response.status_code == 201:

terugkeren "succesvol"

anders:

terugkeren "mislukt"

#-----------------------------------

3. Interface naar een VRF verplaatsen

Deze functie verplaatst een gegeven interface naar een VRF.

#-----------------------------------

def addInterfacetoVRF (ip, poort, tokenID, vrfName, interfaceName, RD, importRT, exportRT):

aanvragen voor invoer

url = "https://" + ip + ":"+ poort + "/api/v1/vrf/" + vrfName

headers = {

"content-type": "application/json",

'X-auth-token': tokenID,

'cache-control': "zonder cache"

}

gegevens = {

"rd": RD,

"doorsturen": [ interfaceName ],

"route-doelstelling": [

{

"actie" : "invoer",

"Gemeenschap": importRT

},

{

"actie" : "uitvoer",

"gemeenschap": exportRT

}

]

}

antwoord = request.request("PUT", url, headers=headers, json=data, verify=False )

indien response.status_code == 204:

terugkeren "succesvol"

anders:

terugkeren "mislukt"

#-----------------------------------

4. IP-adres aan interface toewijzen

Deze functie wijst IP-adres toe aan de interface.

#-----------------------------------

def. assignedInterfaceIP (ip, poort, token-id, interfaceName, interfaceIP, interfaceSubnet):

aanvragen voor invoer

url = "https://" + ip + ":"+ poort + "/api/v1/interfaces/" + interfaceName

headers = {

"content-type": "application/json",

"X-auth-token": tokenID,

'cache-control': "zonder cache"

}

gegevens = {

"type": "Ethernet",

"if-name": interfaceName;

'ip-adres': interfaceIP,

'subnetmasker': interfaceSubnet

}

antwoord = request.request("PUT", url, headers=headers, json=data, verify=False )

indien response.status_code == 204:

retourneren "geslaagd"

anders:

retourneren "mislukt"

#-----------------------------------

5. VRF-bewuste bgp maken

Hierdoor wordt VRF-adresfamilie ipv4 ingeschakeld.

#-----------------------------------

def. creeerVrfBGP (ip, poort, tokenID, vrfName, ASN):

aanvragen voor invoer

url = "https://" + ip + ":"+ poort + "/api/v1/vrf/" + vrfName + "/routing-svc/bgp"

headers = {

"content-type": "application/json",

"X-auth-token": tokenID,

'cache-control': "zonder cache"

}

gegevens = {

'routing-protocol-id': ASN

}

antwoord = request.request("POST", url, headers=headers, json=data, verify=False )

indien response.status_code == 201:

terugkeren "succesvol"

anders:

terugkeren "mislukt"

#-----------------------------------

6. Definieer BGP-buur onder VRF-adresfamilie

Deze functie definieert BGP-buur onder VRF-adresfamilie IPV4.

#-----------------------------------

defdefinedVrfBGPeighbor (ip, poort, tokenID, vrfName, ASN, buurtIP, remoteAS):

aanvragen voor invoer

url = "https://" + ip + ":"+ poort + "/api/v1/vrf/" + vrfName + "/routing-svc/bgp/" + ASN +"/buren"

headers = {

"content-type": "application/json",

"X-auth-token": tokenID,

'cache-control': "zonder cache"

}

gegevens = {

"Routing-Protocol-ID": ASN;

"adres": buurIP,

'afstandsbediening': afstandsbediening

}

antwoord = request.request("POST", url, headers=headers, json=data, verify=False )

indien response.status_code == 201:

terugkeren "succesvol"

anders:

terugkeren "mislukt"

#-----------------------------------

Beschrijving en waarden van invoerparameters

ip = "10.0.0.1"                                       # ip adres van de router

poort = "55443"                                        # REST API-poort op router

gebruikersnaam = "cisco"                                # gebruikersnaam om in te loggen.Dit moet worden geconfigureerd met prioriteitsniveau 15.

wachtwoord = "cisco"                                 # wachtwoord gekoppeld aan gebruikersnaam

tokenID = <waarde return> # Token ID verkregen uit router met behulp van de getToken functie

vrfName = "VRF-A" # naam van de VRF

RD = "3:3" # routeonderscheidingsteken voor VRF

importRT = "34:34" # Routedoel importeren

exportRT = "34:34" # exportroutedoel

interfaceName = "Gigabit Ethernet3" # naam van de Customer Edge (CE) facing-interface

interfaceIP = "192.168.13.3" # IP-adres van CE-interface

interfaceSubnet = "255.255.255.0" # subnett van CE-interface

ASN = "34" # BGP AS-nummer van PE-router

NeighbourIP = "192.168.13.1" # BGP peering IP van CE-router

remoteAS = "11" # AS aantal CE-router

In alle bovengenoemde functies zijn speciale API's voor elke configuratie opgeroepen. Het voorbeeld hieronder toont aan hoe IOS-XE CLI in het algemeen, in het lichaam van REST API vraag over te gaan. Dit kan als tijdelijke oplossing worden gebruikt om te automatiseren als bepaalde API niet beschikbaar is. In de bovenstaande functies is 'content-type' ingesteld op 'application/json', maar in het onderstaande voorbeeld 'content-type' is ingesteld op 'text/plain' als het standaard CLI input parseert.

Dit voorbeeld definieert een interfacebeschrijving voor de interface Gigabit Ethernet3. De configuratie kan worden aangepast door de parameter "cliInput" te wijzigen.

#-----------------------------------

def passCLIIinvoer (ip, poort, tokenID):

aanvragen voor invoer

url = "https://" + ip +":"+ poort + "/api/v1/global/running-config"

headers = {

"content-type": "tekst/effen",

"X-auth-token": tokenID,

'cache-control': "zonder cache"

}

line1 = "Interface Gigabit Ethernet 3"

line2 = "Beschrijving Customer Facing Interface"

cliInput = line1 + "\r\n" + line2

antwoord = request.request("PUT", url, headers=headers, data=cliInput, verify=False )

afdrukken (response.text)

indien response.status_code == 204:

terugkeren "Succesvol"

anders:

terugkeren "mislukt"

#-----------------------------------

Referenties

- Software voor Cisco CRS-1000v Series softwaregids voor cloudservices router

https://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/configuration/b_CSR1000v_Configuration_Guide /b_CSR1000v_Configuration_Guide_chapter_01101.html

- Naslaghandleiding voor Cisco IOS XE REST API-beheer

https://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/restapi/restapi.html

Gebruikte afkortingen:

MPLS - Multi Protocol Label Switching

L3 - Layer 3

VPN - Virtual Private Network

VRF - virtueel routedoorsturen

BGP-protocol voor grensgateway

REST - representatieve staatsoverdracht

API - Application Program Interface

JSON - JavaScript Object Notation

HTTP - Hyper-Text Transfer Protocol