المقدمة
يوضح هذا المستند إستخدام برمجة Python لتوفير MPLS L3VPN على موجه Service Edge (PE) باستخدام REST API. يستخدم هذا المثال موجهات Cisco CSR1000V (IOS-XE) كموجهات PE.
مقدمة من: أنورادا بيريرا
تحرير: كومار سريدهار
المتطلبات الأساسية
- وصول إدارة REST API إلى موجهات CSR1000V (ارجع إلى المراجع في نهاية هذا المستند).
- Python (الإصدار 2.x أو 3.x) و"الطلبات" مكتبة Python مثبتة على الكمبيوتر المستخدم لتكوين الموجهات.
- بعض المعرفة الأساسية برمجة بايثون.
التكوين
الرسم التخطيطي للشبكة
في هذا المثال، يكون التركيز على تكوين معلمات خدمة MPLS L3VPN المطلوبة على موجه PE-1، والتي يتم إبرازها بلون وردي.
إجراء التكوين
يتم تقسيم مهمة التكوين إلى عدد من المهام الفرعية ويتم تنفيذ كل مهمة فرعية ضمن وظيفة معرفة من قبل المستخدم. بهذه الطريقة يمكن إعادة إستخدام الوظائف عند الحاجة.
تستخدم جميع الوظائف مكتبة "طلبات" للوصول إلى واجهات برمجة تطبيقات REST على الموجه وتنسيق البيانات هو JSON. في طلبات HTTP، يتم تعيين المعلمة "verify" على "false" لتجاهل التحقق من صحة شهادة SSL.
1. إسترداد معرف الرمز المميز
قبل المتابعة مع أي تكوين على موجه، يلزمك الحصول على معرف مميز صالح تم الحصول عليه من الموجه. تقوم هذه الدالة ببدء طلب HTTP لمصادقة معرف الرمز المميز والحصول عليه حتى يمكنها إستدعاء واجهات API أخرى باستخدام هذا الرمز المميز. تتضمن إستجابة هذا الطلب معرف الرمز المميز.
#-----------------------------------
def GetToken (ip، port، username، كلمة):
طلبات الاستيراد
إستيراد قاعدة 64
url = https://" + ip +":+ port + "/api/v1/auth/token-services"
الرؤوس = {
'content-type': "application/json"،
التفويض: أساسي + base64.b64encode((username+":" + كلمة المرور).encode('utf-8').decode('ascii')،
عنصر التحكم في ذاكرة التخزين المؤقت: "لا توجد ذاكرة تخزين مؤقت"
}
الاستجابة = requests.request("POST"، url، رؤوس=رؤوس، verify=خطأ )
إذا كانت response.status_code == 200:
return response.json()['token-id']
غير ذلك:
رجوع "فشل"
#-----------------------------------
2. إنشاء VRF
ستقوم هذه الوظيفة بإنشاء VRF على موجه PE مع علامة المسار المطلوبة (RD) وأهداف مسار الاستيراد/التصدير (RT)
#-----------------------------------
def createVRF (ip، port، tokenID، vrfName، rd، importRT، exportRT):
طلبات الاستيراد
url = "https://" + IP + ":"+ المنفذ + "/api/v1/vrf"
الرؤوس = {
'content-type': "application/json"،
'X-auth-token': TokenID،
'control-cache': "لا ذاكرة تخزين مؤقت"
}
البيانات = {
'name': vrfName،
د:
'route-target' : [
{
'action' :"import"،
'community': ImportRT
},
{
'action' :"export"،
المجتمع: ExportRt
}
]
}
الاستجابة = requests.request("POST"، url، الرؤوس=headers، json=data، verify=false )
إذا كانت response.status_code == 201:
رجوع "ناجح"
غير ذلك:
رجوع "فشل"
#-----------------------------------
3. نقل الواجهة إلى VRF
ستقوم هذه الوظيفة بنقل واجهة معينة إلى VRF.
#-----------------------------------
def addInterfacestoVRF (ip، port، tokenID، vrfName، interfaceName، rd، importRT، exportRT):
طلبات الاستيراد
url = "https://" + IP + ":"+ المنفذ + "/api/v1/vrf/" + vrfName
الرؤوس = {
'content-type': "application/json"،
'X-auth-token': TokenID،
'control-cache': "لا ذاكرة تخزين مؤقت"
}
البيانات = {
د:
'forwarding': [ interfaceName]،
'route-target' : [
{
'action':"import"،
'community': ImportRT
},
{
'action':"export"،
المجتمع: ExportRt
}
]
}
الاستجابة = requests.request("PUT"، url، الرؤوس=headers، json=data، verify=false )
إذا كانت response.status_code == 204:
رجوع "ناجح"
غير ذلك:
رجوع "فشل"
#-----------------------------------
4. تعيين عنوان IP للواجهة
ستقوم هذه الوظيفة بتعيين عنوان IP للواجهة.
#-----------------------------------
def assignInterfaceIP (ip، port، tokenID، interfaceName، interfaceIP، interfaceSubnet):
طلبات الاستيراد
url = "https://" + IP + ":"+ المنفذ + "/api/v1/interfaces/" + interfaceName
الرؤوس = {
'content-type': "application/json"،
'X-auth-token': TokenID،
'control-cache': "لا ذاكرة تخزين مؤقت"
}
البيانات = {
'type': "ethernet"،
'if-name': interfaceName،
'ip-address': interfaceIP،
'subnet-mask': interfaceSubnet
}
الاستجابة = requests.request("PUT"، url، الرؤوس=headers، json=data، verify=false )
إذا كانت response.status_code == 204:
إرجاع "ناجح"
غير ذلك:
إرجاع "فشل"
#-----------------------------------
5. إنشاء بروتوكول BGP واعيا بعامل VRF
سيؤدي هذا إلى تمكين IPv4 الخاص بعائلة عناوين VRF.
#-----------------------------------
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،
'control-cache': "لا ذاكرة تخزين مؤقت"
}
البيانات = {
'routing-protocol-id': ASN
}
الاستجابة = requests.request("POST"، url، الرؤوس=headers، json=data، verify=false )
إذا كانت response.status_code == 201:
رجوع "ناجح"
غير ذلك:
رجوع "فشل"
#-----------------------------------
6. تحديد جار BGP ضمن عائلة عناوين VRF
ستحدد هذه الوظيفة جار BGP ضمن IPv4 لعائلة عنوان VRF.
#-----------------------------------
def defineVrfBGPNgbor (ip، port، tokenID، vrfName، ASN، neighborsIP، remoteAS):
طلبات الاستيراد
url = "https://" + IP + ":"+ المنفذ + "/API/v1/vrf/" + vrfName + "/routing-svc/bgp/" + ASN +"/neighbors"
الرؤوس = {
'content-type': "application/json"،
'X-auth-token': TokenID،
'control-cache': "لا ذاكرة تخزين مؤقت"
}
البيانات = {
'routing-protocol-id': ASN،
'address': الجيران IP،
'remote-as': remoteAS
}
الاستجابة = requests.request("POST"، url، الرؤوس=headers، json=data، verify=false )
إذا كانت response.status_code == 201:
رجوع "ناجح"
غير ذلك:
رجوع "فشل"
#-----------------------------------
وصف معلمات الإدخال وقيمها
ip = "10.0.0.1 " # عنوان IP للموجه
المنفذ = "55443" # منفذ REST API على الموجه
username = "cisco" # username إلى تسجيل الدخول.يجب تكوين هذا مع مستوى الامتياز 15.
كلمة السر = "cisco" # كلمة المرور المقترنة باسم المستخدم
TokenID = <القيمة التي تم إرجاعها> # معرف Token الذي تم الحصول عليه من الموجه باستخدام وظيفة GetToken
vrfName = "VRF-A" # اسم ال VRF
RD = "3:3" # مميزات المسار ل VRF
ImportRT = "34:34" # إستيراد هدف المسار
التصديرRT = "34:34" # هدف مسار التصدير
اسم الواجهة = "GigabitEthernet3" # اسم واجهة واجهة حافة العميل (CE)
interfaceIP = "192.168.13.3" # عنوان IP لواجهة واجهة CE الموجهة
InterfaceSubnet = "255.255.255.0"# شبكة فرعية للواجهة الموجهة CE
ASN = "34" # BGP كعدد من موجه PE
مجاور IP = "192.168.13.1" # BGP Peering IP من موجه CE
RemoteAS = "11" # كعدد من موجه CE
وفي جميع الوظائف المذكورة أعلاه، تم إستدعاء واجهات برمجة تطبيقات مخصصة لكل عملية تكوين. يوضح المثال التالي كيفية تمرير واجهة سطر الأوامر IOS-XE، بشكل عام، في متن واجهة برمجة تطبيقات REST. يمكن إستخدام هذا كحل بديل لأتمتة حالة عدم توفر واجهة برمجة تطبيقات معينة. في الدالات المذكورة أعلاه، يتم تعيين "نوع المحتوى" على "التطبيق/json"، ولكن في المثال التالي، يتم تعيين "نوع المحتوى" على "نص/عادي" حيث إنه يقوم بتحليل إدخال واجهة سطر الأوامر (CLI) القياسي.
يحدد هذا المثال وصف الواجهة للواجهة GigabitEthernet3. يمكن تخصيص التكوين بتغيير المعلمة "cliInput".
#-----------------------------------
def passCLIInput (ip، port، tokenID):
طلبات الاستيراد
url = https://" + ip + ":+ port + "/api/v1/global/running-config"
الرؤوس = {
'content-type': "text/plain"،
'X-auth-token': TokenID،
'control-cache': "لا ذاكرة تخزين مؤقت"
}
line1 = "واجهة GigabitEthernet 3"
السطر 2 = "واجهة واجهة واجهة واجهة العميل التي تدعم الوصف"
cliInput = line1 + "\r\n" + line2
الاستجابة = requests.request("PUT"، url، رؤوس=رؤوس، data=cliInput، verify=false )
طباعة(response.text)
إذا كانت response.status_code == 204:
رجوع "منتصر"
غير ذلك:
رجوع "فشل"
#-----------------------------------
المراجع
- دليل تكوين برنامج موجه خدمات السحابة Cisco CSR 1000V Series Cloud Services Router Software
https://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/configuration/b_CSR1000v_Configuration_Guide /b_CSR1000v_Configuration_Guide_chapter_01101.html
- دليل مرجع إدارة واجهة برمجة التطبيقات IOS XE REST من Cisco
https://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/restapi/restapi.html
المختصرات المستخدمة:
MPLS - تحويل التسمية متعدد البروتوكولات
L3 - الطبقة 3
VPN - الشبكة الخاصة الظاهرية
VRF - إعادة توجيه المسار الظاهري
BGP - بروتوكول العبارة الحدودية
الراحة - نقل الحالة التمثيلية
واجهة برنامج التطبيق - API
تدوين كائن Java Script
HTTP - بروتوكول نقل النص التشعبي