المحتويات

المقدمة

المتطلبات الأساسية

المتطلبات

المكونات المستخدمة

القيود

التكوين

الخطوة 1. تكوين IOx لاستضافة التطبيقات.

الخطوة 2. قم بتثبيت حزم Python في Guestshell.

الخطوة 3. تكوين المصادقة لمكالمات CSR1000V API.

الخطوة 4. قم بتكوين HAv2 في Guestshell.

الخطوة 5. قم بتكوين IM لتشغيل عمليات تجاوز الفشل.

التحقق من الصحة

استكشاف الأخطاء وإصلاحها

المقدمة

يعمل هذا المستند كدليل تكوين تكميلي للإصدار 2 (HAv2) عالي التوفر في Azure. تم العثور على التفاصيل الكاملة في دليل نشر Cisco CSR 1000v ل Microsoft Azure. يتم دعم HAv2 أولا في Cisco IOS-XE® Denali 16.9.1s.

في HAv2، تم نقل تنفيذ HA إلى خارج رمز Cisco IOS XE ويتم تشغيله في حاوية Guestshell. لمزيد من المعلومات عن Guestshell، راجع قسم Guest Shell في دليل تكوين قابلية البرمجة. في HAv2، يتم إجراء تكوين عقد التكرار في طبقة الأمان باستخدام مجموعة من برامج Python النصية.

المتطلبات الأساسية

المتطلبات

توصي Cisco بأن تكون لديك معرفة بالمواضيع التالية:

- حساب Microsoft Azure.

- موجهات CSR1000V بسرعة 2x مع واجهات جيجابت. يجب أن تكون الواجهة الأمامية الخارجية على GigabitEthernet1 (eth0).

- حد أدنى من Cisco IOS-XE® Denali 16.9.1s.

المكونات المستخدمة

تستند المعلومات الواردة في هذا المستند إلى Cisco IOS-XE® Denali 16.9.1s الذي تم نشره محليا من سوق Azure.

قد تتكبد الموارد التي تم نشرها في Azure من الخطوات الواردة في هذا المستند تكلفة.

تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك قيد التشغيل، فتأكد من فهمك للتأثير المحتمل لأي أمر.

القيود

- يجب تكوين الواجهة الخارجية العامة على th0 والتي تتطابق مع GigabitEthernet1. لا يمكن الوصول إلى خادم بيانات تعريف Azure إلا من خلال الواجهة الأساسية على جهاز ظاهري.

- إذا كان تكوين HAv1 IOS موجودا، فيجب إزالته قبل تكوين HAv2 في guestshell. يتكون تكوين HAv1 من أوامر التكرار ومزود السحابة.

التكوين

الخطوة 1. تكوين IOx لاستضافة التطبيقات.

1. تمكين إستضافة تطبيقات IOx. قم بتعيين عنوان IP خاص إلى VirtualPortGroup0. nat VirtualPortGroup0 مع العام قارن أن يسمح Guestshell أن يصل إلى الإنترنت. في هذا المثال، يكون IP الخاص ب GigabitEthernet1 هو 10.3.0.4.

vrf definition GS

!

iox

app-hosting appid guestshell

app-vnic gateway1 virtualportgroup 0 guest-interface 0

guest-ipaddress 192.168.35.102 netmask 255.255.255.0

app-default-gateway 192.168.35.101 guest-interface 0

name-server0 8.8.8.8

!

interface VirtualPortGroup0

vrf forwarding GS

ip address 192.168.35.101 255.255.255.0

ip nat inside

!

interface GigabitEthernet1

ip nat outside

!

ip access-list standard GS_NAT_ACL

permit 192.168.35.0 0.0.0.255

!

ip nat inside source list GS_NAT_ACL interface GigabitEthernet1 vrf GS overload

!

! The static route points to the gig1 private ip address gateway

ip route vrf GS 0.0.0.0 0.0.0.0 GigabitEthernet1 10.1.0.1 global

ملاحظة: قد تكون المثيلات الجديدة التي تم نشرها من موقع Azure Marketplace مهيأة مسبقا ل IOx.

الخطوة 2. قم بتثبيت حزم Python في Guestshell.

1. تمكين Guestshell وتسجيل الدخول.
csr-1#guestshell enable

csr-1#guestshell

2. إختبار الاتصال www.google.com للتحقق من إمكانية وصول Guestshell إلى الإنترنت. إذا كان يتعذر الوصول إليه، فتحقق من تكوين خادم الاسم في تكوين IOS الخاص باستضافة التطبيق أو قم بإضافة خادم في resolv.conf في guestshell.
[guestshell@guestshell ~]$ ping www.google.com

PING www.google.com (172.217.14.228) 56(84) bytes of data.

64 bytes from sea30s02-in-f4.1e100.net (172.217.14.228): icmp_seq=1 ttl=51 time=4.89 ms

64 bytes from sea30s02-in-f4.1e100.net (172.217.14.228): icmp_seq=2 ttl=51 time=5.02 ms

قم بتشغيل التفاف للتحقق من أنه يمكن إعادة البحث عن بيانات التعريف. يجب أن تكون الواجهة الخارجية الأمامية gig1 (eth0). وإلا، فتحقق من مجموعات أمان Azure أو التوجيه أو الميزات الأخرى التي قد تمنع 169.254.169.254. لا يعد 169.254.169.254 عنوانا قابلا للتجميع.

[guestshell@guestshell ~]$ curl -H Metadata:true "http://169.254.169.254/metadata/instance?api-version=2018-04-02"

{"compute":{"location":"westus2","name":"csr-david-2","offer":"cisco-csr-1000v","osType":"Linux","placementGroupId":"","plan":{"name":"16_7","product":"cisco-csr-1000v","publisher":"cisco"},"platformFaultDomain":"0","platformUpdateDomain":"0","publicKeys":[],"publisher":"cisco","resourceGroupName":"RG-David-2","sku":"16_7","subscriptionId":"09e13fd4-def2-46aa-a056-xxxxxxxxxxx","tags":"","version":"16.7.120171201","vmId":"f8f32b48-daa0-4053-8ba4-xxxxxxxxxxxxx","vmScaleSetName":"","vmSize":"Standard_DS2_v2","zone":""},"network":{"interface":[{"ipv4":{"ipAddress":[{"privateIpAddress":"10.3.0.5","publicIpAddress":"21.53.135.210"}],"subnet":[{"address":"10.3.0.0","prefix":"24"}]},"ipv6":{"ipAddress":[]},"macAddress":"000D3A93F"},{"ipv4":{"ipAddress":[{"privateIpAddress":"10.3.1.5","publicIpAddress":""}],"subnet":[{"address":"10.3.1.0","prefix":"24"}]},"ipv6":{"ipAddress":[]},"macAddress":"000D3A961"}]}}[

3. قم بتثبيت حزم بايثون.
ملاحظة: لا تستخدم وضع السدو لتثبيت الحزم. تأكد من إستخدام خيار —المستخدم. يؤدي الفشل في تنفيذ الخطوات الثلاث جميعها إلى تثبيت الحزم في المجلد الخطأ. قد يؤدي ذلك إلى ImportErrors. لإصلاح الحزم التي تم تثبيتها بشكل غير صحيح، قد تحتاج إلى تشغيل أمر IOS guestshell الذي يدمر ويبدأ من جديد.

[guestshell@guestshell ~]$ pip install csr_azure_guestshell~=1.1 --user

[guestshell@guestshell ~]$ pip install csr_azure_ha~=1.0 --user

[guestshell@guestshell ~]$ source ~/.bashrc

4. تأكد من تثبيت الحزم بشكل صحيح في /home/guestshell/.local/lib/python2.7/site-packages.
[guestshell@guestshell ~]$ which show_node.py

~/.local/lib/python2.7/site-packages/csr_azure_ha/client_api/show_node.py

الخطوة 3. تكوين المصادقة لمكالمات CSR1000V API.

هناك طريقتان للسماح ل CSR1000v بإجراء مكالمات API إلى Azure.

1. Azure Active Directory (AAD) - هذه هي الطريقة HAv1 القياسية التي يمكن إستخدامها أيضا في HAv2. دون معرف المستأجر ومعرف التطبيق ومفتاح التطبيق المطلوب إستخدامه في البرنامج النصي create_node.py. تفضل بزيارة إنشاء تطبيق في Microsoft Azure Active Directory للحصول على تفاصيل.
ملاحظة: مفتاح التطبيق المستخدم في HAv1 هو المفتاح المرمز. مفتاح التطبيق المستخدم في HAv2 هو المفتاح غير المرمز. إذا لم تقم بعمل ملاحظة للمفتاح غير المرمز، فقد تحتاج إلى إنشاء مفتاح جديد لأن المفاتيح لا يمكن إستردادها.

2. لدى Microsoft خدمة هوية الخدمة المدارة (MSI) التي تقوم بأتمتة إنشاء تطبيق للجهاز الظاهري. لمزيد من المعلومات حول MSI، تفضل بزيارة موقع https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/overview. يمكن أن يستخدم HA الإصدار 2 خدمة MSI لمصادقة Cisco CSR 1000V. HA لا يستعمل صيغة 1 MSI.

الخطوة 1. قم بتمكين MSI لكل جهاز افتراضي من الأجهزة الظاهرية CSR1000v. انتقل إلى VM في مدخل Azure. انتقل إلى الهوية وانقر على النظام المعين > على > حفظ.

الخطوة 2. تحت جدول مسار الشبكة الفرعية، للسماح باستدعاءات API من الموجه CSR1000V، أختر التحكم في الوصول (IAM) وانقر فوق إضافة.

الخطوة 3. أختر دور - مساهم الشبكة. أختر تعيين وصول إلى - الجهاز الظاهري. أختر الاشتراك المناسب. حدد الجهاز الظاهري من القائمة التي تم تشغيل MSI الخاص بها.

الخطوة 4. قم بتكوين HAv2 في Guestshell.

1. أستخدم البرنامج النصي create_node.py لإضافة تكوينات HA.  للتحقق من جميع تعريفات معلمات العلامة، قم بعرض الجدولين 3 و 4 من دليل نشر Cisco CSR 1000V ل Microsoft Azure.  يستخدم هذا المثال مصادقة AAD التي تتطلب علامات معرف التطبيق (a) ومعرف المستأجر (d) ومفتاح التطبيق (k).  إذا كنت تستخدم مصادقة MSI، فلن تكون هذه العلامات الإضافية مطلوبة. علامة العقدة [-i] رقم عشوائي.  أستخدم أرقام العقد الفريدة لإنشاء عقد متعددة في حالة الحاجة إلى تحديثات لجداول مسارات متعددة.
create_node.py -i 100 -p azure -s 09e13fd4-def2-46aa-a056-xxxxxxxxxx -g RG-David -t subnet2-david-CSR-RouteTable -r 8.8.8.8/32 -n 10.3.1.4 -a 1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxx -d ae49849c-2622-4d45-b95e-xxxxxxxxx -k bDEN1k8batJqpeqjAuUvaUCZn5Md6rWEi=

2. أستخدم set_params.py لإضافة معلمات فردية أو تغييرها.

set_params.py -i 100 [option1] [option2]

3. أستخدم clear_params.py لمسح المعلمات الفردية.

clear_params.py -i 100 [option1] [option2]

4. أستخدم delete_node.py لحذف العقدة.

delete_node.py -i 100

الخطوة 5. قم بتكوين IM لتشغيل عمليات تجاوز الفشل.

يكون البرنامج النصي node_event.py مع خيار peerFail هو كيف يقوم HAv2 بتشغيل تجاوز الفشل وتحديث جدول مسار Azure. وهنا تصبح لديك المرونة اللازمة لبرمجة منطقك الخاص. يمكنك إستخدام IM داخل IOS لتشغيل node_event.py، أو كتابة برنامج نصي python ضمن guestshell.

أحد الأمثلة على ذلك هو الإمساك بإحدى الواجهات مع إستخدام IM لتشغيل node_event.py.

event manager applet HAv2_interface_flap

event syslog pattern "Interface GigabitEthernet2, changed state to down"

action 1 cli command "enable"

action 2 cli command "guestshell run node_event.py -i 100 -e peerFail"

يمكنك تشغيل node_event.py يدويا في guestshell لاختبار تجاوز الفشل الحقيقي.

[guestshell@guestshell ~]$ node_event.py -i 100 -e peerFail

كما يمكن أن يقوم HAv2 بإرجاع المسار إلى الموجه الأصلي باستخدام خيار الإرجاع. هذا تكوين إختياري يحاكي الاستخدام المسبق. يجب تعيين العلامة -M الأساسية في create_node.py على الموجه الأساسي. هذا مثال أن يستعمل BFD أن يراقب الحالة من القارن.

event manager applet bfd_session_up

event syslog pattern ".*BFD_SESS_UP.*"

action 1 cli command "enable"

action 2 cli command "guestshell run node_event.py -i 100 -e revert"

[guestshell@guestshell ~]$ set_params.py -i 100 -m

التحقق من الصحة

1. تأكد من أن العمليات الثلاث نشطة.

systemctl status auth-token

systemctl status azure-ha

systemctl status waagent

2. قم بإعادة تشغيل أية وحدات أخرى فشلت.

sudo systemctl start waagent

sudo systemctl start azure-ha

sudo systemctl start auth-token

3. طريقتان للتحقق من التكوين الذي تمت إضافته بواسطة create_node.py.

show_node.py -i 100

[guestshell@guestshell ~]$ cat azure/HA/node_file

{'appKey': 'bDEN1k8batJqWEiGXAxSR4Y=', 'index': '100', 'routeTableName': 'subnet2-david-CSR-RouteTable', 'route': '8.8.8.8/32', 'nextHop': '10.3.1.4', 'tenantId': 'ae49849c-2622-4d45-b95e-xxxxxxxxxx', 'resourceGroup': 'RG-David', 'appId': '1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxxx', 'subscriptionId': '09e13fd4-def2-46aa-a056-xxxxxxxxxxx', 'cloud': 'azure'}

4. محاكاة ناعمة لتجاوز الفشل على الموجه الاحتياطي. لا يؤدي ذلك في الواقع إلى تجاوز الفشل ولكنه يتحقق من صحة التكوين. تحقق من السجلات في الخطوة 6.

node_event.py -i 100 -e verify

5. تشغيل حدث تجاوز فشل حقيقي على الموجه الاحتياطي. في Azure، تحقق مما إذا كان جدول المسار قد قام بتحديث المسار إلى الخطوة الجديدة. تحقق من السجلات في الخطوة 6.

node_event.py -i 100 -e peerFail

6. يقوم node_event.py بإنشاء نوعين من السجلات عند التشغيل. يعد هذا الأمر مفيدا للتحقق مما إذا كان تجاوز الفشل ناجحا أو لاستكشاف الأخطاء وإصلاحها. يتم إنشاء ملفات أحداث جديدة في كل مرة. ومع ذلك، يتم إستبدال routeTableGetRSP في كل مرة، لذلك يكون هناك ملف واحد بشكل عام.
[guestshell@guestshell ~]$ ls -latr /home/guestshell/azure/HA/events/

total 5

drwxr-xr-x 3 guestshell root 1024 Sep 18 23:01 ..

drwxr-xr-x 2 guestshell root 1024 Sep 19 19:40 .

-rw-r--r-- 1 guestshell guestshell 144 Sep 19 19:40 routeTableGetRsp

-rw-r--r-- 1 guestshell guestshell 390 Sep 19 19:40 event.2018-09-19 19:40:28.341616

-rw-r--r-- 1 guestshell guestshell 541 Sep 18 23:09 event.2018-09-18 23:09:58.413523

استكشاف الأخطاء وإصلاحها

الخطوة 1. تم تثبيت حزم Python بشكل غير صحيح في /usr/lib/python2.7/site-packages/. قم بتدمير طبقة الأمان واتبع خطوات التكوين.

[guestshell@guestshell ~]$ create_node.py -h

bash: create_node.py: command not found

[guestshell@guestshell ~]$ ls /usr/lib/python2.7/site-packages/

مسار التثبيت الصحيح هو ~/.local/lib/python2.7/site-packages/.

[guestshell@guestshell ~]$ which show_node.py

~/.local/lib/python2.7/site-packages/csr_azure_ha/client_api/show_node.py

الخطوة 2. إذا لم يتم تكوين المصادقة أو تكوينها بشكل غير صحيح في الخطوة 3، فقد يتم إنشاء أخطاء الرمز المميز. بالنسبة لمصادقة AAD، إذا كان مفتاح التطبيق المستخدم غير صالح أو تم تشفير URL، فقد تظهر أخطاء المصادقة بعد تشغيل node_event.py.

[guestshell@guestshell ~]$ cat /home/guestshell/azure/HA/events/routeTableGetRsp

{"error":{"code":"AuthenticationFailedMissingToken","message":"Authentication failed. The 'Authorization' header is missing the access token."}}

[guestshell@guestshell ~]$ cat /home/guestshell/azure/HA/events/event.2018-09-19\ 23\:02\:55.581684

Event type is verify

appKey zGuYMyXQha5Kqe8xdufhUJ9eX%2B1zIhLsuw%3D

index 100

routeTableName subnet2-david-CSR-RouteTable

route 8.8.8.8/32

nextHop 10.3.1.4

tenantId ae49849c-2622-4d45-b95e-xxxxxxxxxx

resourceGroup RG-David

appId 1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxxx

subscriptionId 09e13fd4-def2-46aa-a056-xxxxxxxxxx

cloud azure

All required parameters have been provided

Requesting token using Azure Active Directory

Token=

Failed to obtain token

Reading route table

Route GET request failed with code 401

الخطوة 3. إذا كان معرف المستأجر أو معرف التطبيق غير صحيح.

[guestshell@guestshell ~]$ cat azure/tools/TokenMgr/token_get_rsp

{"error":"invalid_request","error_description":"AADSTS90002: Tenant 1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxxx not found. This may happen if there are no active subscriptions for the tenant. Check with your subscription administrator.\r\nTrace ID: 8bc80efc-f086-46ec-83b9-xxxxxxxxxxx\r\nCorrelation ID: 2c6062f8-3a40-4b0e-83ec-xxxxxxxxxxx\r\nTimestamp: 2018-09-19 23:58:02Z","error_codes":[90002],"timestamp":"2018-09-19 23:58:02Z","trace_id":"8bc80efc-f086-46ec-83b9-xxxxxxxxxxxx","correlation_id":"2c6062f8-3a40-4b0e-83ec-xxxxxxxxxxx"}

الخطوة 4. أثناء تثبيت الحزمة، قد يكون Sudo mode قد تم إستخدامه، — لم يتم تضمين المستخدم، أو لم يتم تشغيل المصدر ~/.bashrc. يؤدي ذلك إلى فشل create_node.py أو إنشاء ImportError.

[guestshell@guestshell ~]$ create_node.py -i 1 -p azure -s d91490ec -g RG -t RT -r 10.12.0.0/11 -n 10.2.0.31 -m secondary

/usr/lib64/python2.7/site-packages/cryptography/hazmat/primitives/constant_time.py:26: CryptographyDeprecationWarning: Support for your Python version is deprecated. The next version of cryptography will remove support. Please upgrade to a 2.7.x release that supports hmac.compare_digest as soon as possible.

utils.DeprecatedIn23,

create_node -i 1 -p azure -s d91490ec -g RG -t RT -r 10.12.0.0/11 -n 10.2.0.31 -m secondary failed

[guestshell@guestshell ~]$ create_node.py -i 1 -p azure -s d91490ec -g RG -t RT -r 10.1.0.0/18 -n 10.2.0.31 -m secondary

Traceback (most recent call last):

File "/usr/bin/create_node.py", line 5, in

import ha_api

ImportError: No module named ha_api

الخطوة 5. تحقق من محفوظات تثبيت الحزمة.

[guestshell@guestshell ~]$ cat azure/HA/install.log

Installing the Azure high availability package

Show the current PATH

/usr/local/bin:/usr/bin:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_ha/client_api

Show the current PYTHONPATH

:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell/TokenMgr:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell/MetadataMgr:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell/bin:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_ha/client_api:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_ha/server

الخطوة 6. تحقق من سجلات تكوين HA.

[guestshell@guestshell ~]$ cat azure/HA/azha.log

2018-09-24 16:56:29.215743 High availability server started with pid=7279

2018-09-24 17:03:20.602579 Server processing create_node command

2018-09-24 17:03:20.602729 Created new node with index 100

الخطوة 6. قم بتشغيل البرنامج النصي debug_ha.sh لتجميع جميع ملفات السجلات في ملف tar واحد.

[guestshell@guestshell ~]$ bash ~/azure/HA/debug_ha.sh

يتم وضع الملف في bootflash الذي يمكن الوصول إليه من كل من Guestshell و IOS.

[guestshell@guestshell ~]$ ls /bootflash/ha_debug.tar

/bootflash/ha_debug.tar

csr-david-2#dir | i debug

28  -rw-            92160  Sep 27 2018 22:42:54 +00:00  ha_debug.tar