المحتويات

المقدمة

الهدف

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

المتطلبات

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

نظرة عامة

ما هو IOx؟

ما هو عميل الأيوكسيد؟

تعريف التطبيق

تطبيق بايثون

تعريف ملف Docker

حزمة

مثال من مستودع قالب Cisco DevNet IOx

التكوين

إجراء التغليف

التركيب

المقدمة

يصف هذا المستند نشر تطبيق باستخدام iXCLIENT.

الهدف

تم تخصيص هذا المستند لفهم نشر تطبيق باستخدام iXclient.

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

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

- معرفة أساسية بأنظمة التشغيل Cisco IOS XE و Cisco IOS.

- فهم قوي لدورة حياة وحدة الإرساء والحاوية.

- عمليات لينوكس الأساسية.

المتطلبات

تأكد إذا كان جهازك يدعم IOx، فيمكنك مراجعة مصفوفة التوافق: مصفوفة دعم منصة العمل

يرجى أيضا تنزيل برنامج IOx Client وفقا لمواصفات الكمبيوتر الشخصي لديك: التنزيلات

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

تستند المعلومات الواردة في هذا المستند إلى إصدارات البرامج والمكونات المادية التالية:

- IOXCLIENT، الإصدار 1.17.0.0

- الموجه C8000v، الإصدار 17.12.3a

- جهاز Ubuntu، الإصدار 20.04

- تثبيت Docker Engine الإصدار 24.0.9 أو إصدار أقدم.

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

نظرة عامة

ما هو IOx؟

IOx هي بيئة تطبيق أجهزة Cisco، وتتيح لنا هذه الميزة حزم التطبيقات بتنسيق متوافق مع IOx، باستخدام أدوات مثل ioxclient.

ما هو عميل الأيوكسيد؟

iXclient هي أداة سطر أوامر تعد جزءا من Cisco IOx SDK. ويتم إستخدامه لتطوير تطبيقات IOx واختبارها ونشرها على أجهزة Cisco IOx.

تعريف التطبيق

يقوم هذا المثال بإنشاء خادم HTTP أساسي للاستماع عبر المنفذ 8000؛ يعمل كوظائف أساسية لصورة إنشاء Docker (Dockerfile).

ملاحظة: يتطلب Dockerfile فقط عند تطوير صور مخصصة بوظائف معينة. يمكن سحب التطبيق من مستودع حاوية وتصديره واستخدامه كأساس ل iXclient.

تطبيق بايثون

import http.server

import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:

print(f"Serving at port {PORT}")

httpd.serve_forever()

تعريف ملف Docker

FROM python:alpine3.20

WORKDIR /apps

COPY . .

EXPOSE 8000

ENTRYPOINT [ "python" ]

CMD [ "main.py" ]

باستخدام هذا الرمز، تقوم بضبط خادم HTTP أثناء الاستماع عبر المنفذ 8000، وحزم التطبيق في ملف Docker.

حزمة

يلزم إنشاء ملف YAML يحتوي على بيانات تعريف وتعريفات موارد من أجل النشر السليم للتطبيق.

الملف YAML هو تنسيق، وهذا التنسيق يجذب نظرا للصيغة البسيطة، وداخل الملف يمكننا تعيين جوانب من التطبيق كمتغيرات بيئية، منافذ، تبعيات وهكذا.

مثال من مستودع قالب Cisco DevNet IOx

descriptor-schema-version: "2.2"

info:

name: iox_docker_python

description: "IOx Docker Python Sample Application"

version: "1.0"

author-link: "http://www.cisco.com"

author-name: "Cisco Systems"

app:

cpuarch: "x86_64"

type: docker

resources:

profile: c1.small

# Specify runtime and startup

startup:

rootfs: rootfs.tar

target: ["python3 main.py"]

يرجى الرجوع إلى الوثائق للاطلاع على القيم الصحيحة في ملف الحزمة:

- وثائق Devnet: واصف حزمة IOx

- مستودع Github:  قالب Cisco DevNet / ioX-app

لهذا المستند، يحتوي ملف تكوين YAML على المعلومات التالية:

descriptor-schema-version: "2.2"

info:

name: "tac_app"

description: "tac_app"

version: "1.0"

author-name: "TAC-TEST"

app:

cpuarch: x86_64

type: docker

resources:

profile: "custom"

cpu: 100                # CPU en MHz assigned to the application.

disk: 50               # Storage in MB for the disk

memory: 128           # Memory en MB assigned to the application.

network:

-

interface-name: eth0

ports:

tcp:

- 8000

startup:

rootfs: "rootfs.tar"         # Container file system

target: "python main.py"     # Command to start the application

نظرا لوجود تعارض بين الإصدار 25.0 من Docker Engine والعميل iXclient، فإن النهج الموصى به هو إستخدام توزيع Linux الذي يدعم الإصدار 24.0.9 من Docker Engine أو إصدار سابق، حيث إن الإصدار 24.0.9 هو أحدث إصدار مدعوم للتوافق مع iOxclient.

في هذا المثال، تم إنشاء صورة Docker المستخدمة لإظهار وظائف عميل IOx على جهاز افتراضي قائم على Ubuntu يعمل بالإصدار 20.04، وقد تم إختياره تحديدا لأن ثنائيات Docker Engine .deb متوفرة لهذا التوزيع/الإصدار.

ملاحظة: الطريقة الوحيدة لتثبيت الإصدارات القديمة من Docker هي تثبيته من خلال ملفات الحاويات. هذه الثنائيات هي نسخ محددة من البرنامج والتي هي بالفعل جاهزة للتشغيل مباشرة على نظام تشغيل معين.

التكوين

لتحضير الجهاز الظاهري بالمواصفات المذكورة، استمر في تثبيت ملف الثنائيات من إصدار قديم من Docker:

wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce-cli_24.0.9-1~ubuntu.20.04~focal_amd64.deb

wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_24.0.9-1~ubuntu.20.04~focal_amd64.deb

wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-buildx-plugin_0.11.2-1~ubuntu.20.04~focal_amd64.deb

wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-compose-plugin_2.21.0-1~ubuntu.20.04~focal_amd64.deb

wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.7.19-1_amd64.deb

And installed them:

sudo dpkg -i ./containerd.io_1.7.19-1_amd64.deb \

./docker-ce_24.0.9-1~ubuntu.20.04~focal_amd64.deb \

./docker-ce-cli_24.0.9-1~ubuntu.20.04~focal_amd64.deb \

./docker-buildx-plugin_0.11.2-1~ubuntu.20.04~focal_amd64.deb \

./docker-compose-plugin_2.21.0-1~ubuntu.20.04~focal_amd64.deb

وبمجرد تثبيت جميع الملفات، تكون الجهاز جاهزة لحزم تطبيق ioX.

إجراء التغليف

قم بنقل رمز python، و Dockerfile إلى الجهاز الظاهري، تحقق من وجود كلا الملفين في نفس الدليل، ثم قم بالمتابعة لإنشاء صورة Docker:

sudo docker build -t tac_app .

لسرد صور Docker المتاحة في مستودع الجهاز المحلي، قم بتشغيل الأمر الموضح أدناه:

ubuntu@ip-172-31-30-249:~$ sudo docker images

REPOSITORY    TAG       IMAGE ID       CREATED          SIZE

tac_app       latest    94a1c2ba4b08   19 seconds ago   1.78GB

من هنا يوجد بديلان

1 - حزم التطبيق باستخدام صورة Docker وحزمة ملف الواصف.yaml

2 - تصدير الصورة كنظام ملفات جذري وتعبئتها باستخدام ملف الواصف YAML

الخيار 1 - حزم صورة Docker وملف YAML:

انتقل إلى الدليل الهدف حيث تريد حزم الصورة، وملف YAML.

ubuntu@ip-172-31-30-249:~/tes0$ ls

package.yaml

ثم، قم بحزم الملف بتشغيل هذا الأمر:

ioxclient docker package tac_app package.yaml

...

Example:

ubuntu@ip-172-31-30-249:~/tese$ sudo /home/ubuntu/ioxclient_1.17.0.0_linux_amd64/ioxclient docker package tac_app package.yaml

Currently active profile: default

Secure client authentication: no

Command Name: docker-package

Timestamp at DockerPackage start: 1748211382584

Using the package descriptor file in the project dir

Validating descriptor file package.yaml with package schema definitions

Parsing descriptor file..

Found schema version 2.7

Loading schema file for version 2.7

Validating package descriptor file..

File package.yaml is valid under schema version 2.7

Generating 10x package of type docker with layers as rootfs

Replacing symbolically linked layers in docker rootfs, if any

No symbolically linked layers found in rootfs. No changes made in rootfs

Removing emulation layers in docker rootfs, if any

The docker image is better left in it's pristine state

Updated package metadata file :/home/ubuntu/tes0/.package.metadata

No rsa key and/or certificate files provided to sign the package

-------------------------------------------------------------------

Generating the envelope package

-------------------------------------------------------------------

Checking if package descriptor file is present..

Skipping descriptor schema validation..

Created Staging directory at : /tmp/1093485025

Copying contents to staging directory

Timestamp before CopyTree: 1748211503878

Timestamp after CopyTree: 1748211575671

Creating artifacts manifest file

Creating an inner envelope for application artifacts

Including rootfs.tar

Generated /tmp/1093485025/artifacts.tar.gz

Parsing Package Metadata file /tmp/1093485025/.package.metadata

Updated package metadata file /tmp/1093485025/.package.metadata

Calculating SHA256 checksum for package contents..

Timestamp before SHA256: 1748211630718

Timestamp after SHA256: 1748211630718

Path:.package.metadata

SHA256: 50c922f103ddc01a5dc7a98d6cacefb167f4a2c692dfc521231bb42f0c3dcf55 Timestamp before SHA256: 1748211630719

Timestamp after SHA256: 1748211630719

Path: artifacts.mf

SHA256: 511008aa2d1418daf1770768fb79c90f16814ff7789d03beb4f4ea1bf4fae8f2 Timestamp before SHA256: 1748211630719

Timestamp after SHA256: 1748211634941

Path: artifacts.tar.gz

SHA256: 0cc3f69af50cf0a01ec9a1400c440f60a0dff55369bd309b6dfc69715302425+ Timestamp before SHA256: 1748211634941

Timestamp after SHA256: 1748211634952

Path: envelope_package.tar.gz

SHA256: d492de09441a241f879cd268cd1b3424ee79a58a9495aa77ae5b11cab2fd55da Timestamp before SHA256: 1748211634953

Timestamp after SHA256: 1748211634963

Path: package.yaml

SHA256: d8dc7253443ff3ad080c42bc8d82db4c3ea7ae9b2d0e2f827fbaf2bc80245f62 Generated package manifest at package.mf

Generating IOx Package..

Package docker image tac_app at /home/ubuntu/tes0/package.tar

ubuntu@ip-172-31-30-249:~/tes0$ |

كانت هذه المجموعة من الإجراءات مسؤولة عن إنشاء حزمة tar الحزمة. من أجل فحص محتويات الحزمة، يمكننا فك ضغطها باستخدام الأداة المساعدة tar

ubuntu@ip-172-31-30-249:~/tes0$ tar -tf package.tar

package.yaml

artifacts.mf

.package.metadata

package.mf

envelope_package.tar.gz

artifacts.tar.gz

الخيار 2 - تصدير صورة Docker كنظام ملفات جذري وتجميعها باستخدام ملف Descriptor YAML.

قم بتشغيل الأمر في الدليل حيث سيتم إنشاء الصورة:

ubuntu@ip-172-31-30-249:~/tac_app$ sudo docker save tac_app -o rootfs.tar

يقوم هذا الأمر بتصدير صورة Docker كحزمة تحتوي على نظام الملفات الجذر الذي يتم تحميله على / داخل الحاوية.

انقل ملف الحزمة.YAML إلى الموقع المحدد. بمجرد اكتمال بنية الدليل، يجب أن تظهر التشابه كما هو موضح:

ubuntu@ip-172-31-30-249:~/tac_app$ ls

package.yaml   rootfs.tar

تتضمن الخطوة الأخيرة حزم صورة Docker بتنفيذ هذا الأمر:

ioxclient docker package tac_app package.yaml

...

ubuntu@ip-172-31-30-249:~/tac_app$ ioxclient package .

Currently active profile :  default

Secure client authentication:  no

Command Name:  package

No rsa key and/or certificate files provided to sign the package

Checking if package descriptor file is present..

Validating descriptor file /home/ubuntu/tac_app/package.yaml with package schema definitions

Parsing descriptor file..

Found schema version  2.7

Loading schema file for version  2.7

Validating package descriptor file..

File /home/ubuntu/tac_app/package.yaml is valid under schema version 2.7

Created Staging directory at :  /tmp/2119895371

Copying contents to staging directory

Timestamp before CopyTree: 1748374177879

Timestamp after CopyTree: 1748374357306

Creating artifacts manifest file

Creating an inner envelope for application artifacts

Generated  /tmp/2119895371/artifacts.tar.gz

Updated package metadata file :  /tmp/2119895371/.package.metadata

Calculating SHA256 checksum for package contents..

Timestamp before SHA256: 1748374566796

Timestamp after SHA256: 1748374566796

Path:  .package.metadata

SHA256 : 4fad07c3ac4d817db17bacc8563b4c632bc408d2a9cbdcb5e7a526c1c5c6e04e

Timestamp before SHA256: 1748374566796

Timestamp after SHA256: 1748374566809

Path:  artifacts.mf

SHA256 : d448a678ae952f9fe74dc19172aba17e283a5e268aca817fefc78b585f02b492

Timestamp before SHA256: 1748374566809

Timestamp after SHA256: 1748374575477

Path:  artifacts.tar.gz

SHA256 : 64d70f43be692e3cee61d906036efef45ba29e945437237e1870628ce64d5147

Timestamp before SHA256: 1748374575477

Timestamp after SHA256: 1748374575489

Path:  package.yaml

SHA256 : d8dc7253443ff3ad080c42bc8d82db4c3ea7ae9b2d0e2f827fbaf2bc80245f62

Generated package manifest at  package.mf

Generating IOx Package..

Package generated at /home/ubuntu/tac_app/package.tar

ونتيجة لهذه الإجراءات، يتم إنشاء حزمة الملفات.tar وإعداده للنشر. لفحص محتويات الحزمة، قم بتشغيل الأمر الظاهر:

ubuntu@ip-172-31-30-249:~/tac_app$ tar -tf  tac_app.tar

package.yaml

artifacts.mf

.package.metadata

package.mf

artifacts.tar.gz

التركيب

بعد إعداد التطبيق، تتضمن الخطوة الأخيرة تثبيته على الجهاز الهدف بتشغيل الأمر في وضع EXEC ذي الامتيازات كما هو موضح:

app-hosting install appid tacapp package bootflash:package.tar

انتظر حوالي دقيقة واحدة وقم بتأكيد ما إذا كان التطبيق يعمل بنجاح:

Router# show app-hosting list

App id                                   State

---------------------------------------------------------

tacapp                               RUNNING