目录

简介

先决条件

配置

网络图

配置过程

1.检索令牌ID

2.创建VRF

3. 将接口移入VRF

4.为接口分配IP地址

5.创建VRF感知bgp

6.在VRF地址系列下定义BGP邻居

参考

使用的首字母缩略词:

简介

本文档演示使用Python编程在服务提供商边缘(PE)路由器上使用REST API调配MPLS L3VPN。本示例使用Cisco CSR1000v(IOS-XE)路由器作为PE路由器。

作者：阿努拉达·佩雷拉

编辑者：Kumar Sridhar

先决条件

- 对CSR1000v路由器的REST API管理访问（请参阅本文档末尾的参考资料）。

- Python（版本2.x或3.x）和“请求” Python库安装在用于配置路由器的计算机上。

- Python编程的一些基础知识。

配置

网络图

在本示例中，重点介绍如何在PE-1路由器上配置所需的MPLS L3VPN服务参数，这些参数以粉红色突出显示。

配置过程

配置任务被划分为多个子任务，每个子任务在用户定义的功能下实施。这样，在需要时可以重复使用功能。

所有函数都使用“请求”库来访问路由器上的REST API，数据格式为JSON。 在HTTP请求中，“verify”参数设置为“False”以忽略验证SSL证书。

1.检索令牌ID

在路由器上执行任何配置之前，您需要从路由器获取有效的令牌ID。此功能发起HTTP请求以验证和获取令牌ID，以便它可使用此令牌调用其他API。此请求的响应包括令牌ID。

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

def getToken（ip、端口、用户名、密码）：

导入请求

import base64

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

信头= {

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

'authorization': "基本" + base64.b64encode((用户名+ ":" + password)。encode('UTF-8'))。decode('ascii'),

'cache-control': "no-cache"

}

response = requests.request("POST", url， headers=headers， verify=False)

如果response.status_code == 200:

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

其他:

返回 "失败"

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

2.创建VRF

此功能将在PE路由器上创建具有所需路由标识符(RD)和导入/导出路由目标(RT)的VRF

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

def createVRF(ip、port、tokenID、vrfName、RD、importRT、exportRT):

导入请求

url = "https://" + ip + ":"+端口+"/api/v1/vrf"

信头= {

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

'X-auth-token':tokenID，

'cache-control': "no-cache"

}

数据= {

'name':vrfName、

'rd':RD，

'route-target': [

{

'操作': "导入",

'社区':importRT

},

{

'操作': "导出",

'社区':exportRT

}

]

}

response = requests.request("POST", url， headers=headers， json=data， verify=False)

如果response.status_code == 201:

返回 "成功"

其他:

返回 "失败"

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

3. 将接口移入VRF

此功能会将给定接口移动到VRF中。

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

def addInterfacetoVRF（ip、端口、令牌ID、vrfName、接口名称、RD、importRT、exportRT）：

导入请求

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

信头= {

'content-type':“application/json”,

'X-auth-token': tokenID，

'cache-control': "no-cache"

}

数据= {

'rd':RD，

'forwarding': [ interfaceName ],

'route-target': [

{

'操作':"导入",

'社区':importRT

},

{

'操作':"导出",

'社区':exportRT

}

]

}

response = requests.request("PUT", url， headers=headers， json=data， verify=False)

如果response.status_code == 204:

返回 "成功"

其他:

返回 "失败"

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

4.为接口分配IP地址

此功能将为接口分配ip地址。

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

def assignInterfaceIP(ip、port、tokenID、interfaceName、interfaceIP、interfaceSubnet):

导入请求

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

信头= {

'content-type':“application/json”,

'X-auth-token':tokenID，

'cache-control': "no-cache"

}

数据= {

'类型':"以太网",

'if-name'：接口名称，

'ip-address':interfaceIP，

'subnet-mask'：接口子网

}

response = requests.request("PUT", url， headers=headers， json=data， verify=False)

如果response.status_code == 204:

返回“成功”

其他:

返回“失败”

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

5.创建VRF感知bgp

这将启用VRF地址系列ipv4。

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

def createVrfBGP(ip、port、tokenID、vrfName、ASN):

导入请求

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

信头= {

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

'X-auth-token':tokenID，

'cache-control': "no-cache"

}

数据= {

'routing-protocol-id':ASN

}

response = requests.request("POST", url， headers=headers， json=data， verify=False)

如果response.status_code == 201:

返回 "成功"

其他:

返回 "失败"

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

6.在VRF地址系列下定义BGP邻居

此功能将在VRF地址系列IPV4下定义BGP邻居。

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

def defineVrfBGPNeighbor(ip、port、tokenID、vrfName、ASN、neighborIP、remoteAS):

导入请求

url = "https://" + ip + ":"+端口+ "/api/v1/vrf/" + vrfName +"/routing-svc/bgp/" + ASN +"/neighbors"

信头= {

'content-type':“application/json”,

'X-auth-token':tokenID，

'cache-control': "no-cache"

}

数据= {

'routing-protocol-id':ASN，

'address':neighborIP，

'remote-as': remoteAS

}

response = requests.request("POST", url， headers=headers， json=data， verify=False)

如果response.status_code == 201:

返回 "成功"

其他:

返回 "失败"

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

输入参数的说明和值

ip = "10.0.0.1"                                       # ip address of the router（路由器的ip地址）

端口 = “55443”                                        路由器上的REST API端口数量

用户名= " 思科"                                #要登录的用户名。这应该配置为权限级别15。

密码= " 思科"                                 #与用户名关联的密码

tokenID = <返回值> #使用getToken函数从路由器获取的令牌ID

vrfName = "VRF-A" #VRF的名称

RD = "3:3"# VRF的路由标识符

importRT = "34:34" #导入路由目标

exportRT = "34:34" #导出路由目标

interfaceName = "GigabitEthernet3" #面向客户边缘(CE)的接口的名称

interfaceIP = "192.168.13.3" # CE面向接口的IP地址

interfaceSubnet = "255.255.255.0" #面向CE的接口的子网

ASN = "34" # BGP AS number of PE router

neighborIP = "192.168.13.1" # CE路由器的BGP对等IP

remoteAS = "11" # AS的CE路由器数量

在上述所有功能中，为每个配置步骤调用了专用API。以下示例演示如何在REST API调用的主体中通常传递IOS-XE CLI。如果特定API不可用，可以将此方法用作自动执行的一种解决方法。在上述函数中，“content-type”设置为“application/json”，但在以下示例中，“content-type”设置为“text/plain”，因为它正在解析标准CLI输入。

此示例定义接口GigabitEthernet3的接口描述。 可通过更改“cliInput”参数自定义配置。

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

def passCLInput(ip、port、tokenID):

导入请求

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

信头= {

'content-type':"text/plain",

'X-auth-token':tokenID，

'cache-control': "no-cache"

}

line1 = "Interface GigabitEthernet 3"

line2 = "description Customer Facing Interface"

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

response = requests.request("PUT", url， headers=headers， data=cliInput， verify=False)

print(response.text)

如果response.status_code == 204:

返回 "成功"

其他:

返回 "失败"

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

参考

- Cisco CSR 1000v系列云服务路由器软件配置指南

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

- Cisco IOS XE REST API管理参考指南

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

使用的首字母缩略词:

MPLS — 多协议标签交换

L3 — 第3层

VPN — 虚拟专用网络

VRF — 虚拟路由转发

BGP — 边界网关协议

REST — 具象状态传输

API — 应用程序接口

JSON - Java脚本对象表示法

HTTP — 超文本传输协议