
مقال 6 دقائق للقراءة
درس اليوم: الأتمتة والبرمجة — Network Automation و REST APIs (JSON/YAML)
CCNA 200-301 | Network Automation, REST APIs & Data Formats
تخيّل أنك مطالب بتغيير إعداد واحد على 200 سويتش. بالطريقة التقليدية ستدخل على كل جهاز بـ SSH وتكتب الأوامر 200 مرة، وكل مرة قد تخطئ. الحل هو الأتمتة (Automation): تكتب التغيير مرة واحدة ويُنفَّذ على الجميع بالدقة نفسها. هذا الدرس بوابتك لمحور Automation and Programmability في الامتحان.
🍽️ تشبيه: أنت في مطعم. لا تدخل المطبخ لتطبخ بنفسك، بل تعطي طلبك للنادل بصيغة يفهمها، فينقله للمطبخ ويعود لك بالنتيجة. النادل = الـ API، والمطبخ = جهاز الشبكة، وقائمة الطعام = توثيق الـ API.
1. لماذا الأتمتة؟
· السرعة: مئات الأجهزة في دقائق. · الدقة: إزالة الأخطاء البشرية والاختلاف بين الأجهزة. · الاتساق: الإعدادات نفسها في كل مكان (Configuration Consistency). · الاكتشاف المبكر للانحراف: مقارنة الإعداد الفعلي بالإعداد المطلوب (Configuration Drift).
من CLI إلى API: الـ CLI مصمم لقراءة الإنسان، أما الـ API فمصمم للتخاطب بين البرامج بصيغ منظمة يسهل معالجتها.
🔗 ربط بدرس SDN: الـ Northbound API يخاطب التطبيقات، والـ Southbound API يخاطب أجهزة الشبكة. وفي هذا الدرس نتعلم لغة هذه الواجهات.
2. REST API
REST أسلوب لبناء الـ APIs فوق بروتوكول HTTP/HTTPS. العميل (برنامج أو سكربت) يرسل طلباً إلى URI محدد، ويعيد السيرفر استجابة بصيغة JSON غالباً.
خصائصه:
· Client-Server: فصل بين الطالب والمزوّد. · Stateless: كل طلب مستقل ويحمل ما يحتاجه (التوثيق مثلاً)، ولا يتذكر السيرفر الطلب السابق. · يعتمد على الموارد (Resources): كل شيء له عنوان URI، مثل واجهة أو مستخدم.
أفعال HTTP (CRUD)
| الفعل | العملية | المعنى |
|---|---|---|
| GET | Read | قراءة البيانات |
| POST | Create | إنشاء مورد جديد |
| PUT | Update/Replace | استبدال مورد بالكامل |
| PATCH | Update | تعديل جزء من المورد |
| DELETE | Delete | حذف مورد |
💡 احفظها: CRUD = Create, Read, Update, Delete.
بنية الطلب
مثال: قراءة الواجهات من جهاز يدعم RESTCONF
``` GET https://10.0.0.1/restconf/data/ietf-interfaces:interfaces Header: Accept: application/yang-data+json ```
· URI: عنوان المورد، ويتكون من البروتوكول والعنوان والمسار. · Headers: معلومات إضافية، مثل صيغة البيانات والتوثيق. · Body: البيانات المرسلة (في POST و PUT و PATCH).
رموز الاستجابة (Status Codes)
| الرمز | المعنى |
|---|---|
| 200 OK | نجح الطلب |
| 201 Created | أُنشئ المورد بنجاح |
| 204 No Content | نجح ولا يوجد محتوى للإرجاع |
| 400 Bad Request | الطلب خاطئ الصياغة |
| 401 Unauthorized | لم تُوثَّق هويتك |
| 403 Forbidden | موثَّق لكن لا صلاحية لك |
| 404 Not Found | المورد غير موجود |
| 500 Server Error | خطأ في السيرفر |
💡 قاعدة: 2xx نجاح، 4xx خطأ من العميل، 5xx خطأ من السيرفر.
3. صيغ البيانات (Data Formats)
لكي يفهم البرنامج الاستجابة نحتاج صيغة منظمة. الأشهر: JSON وYAML وXML.
JSON (JavaScript Object Notation)
الأكثر استخداماً في الـ REST APIs.
```json { "interface": { "name": "GigabitEthernet0/1", "description": "Uplink to Core", "enabled": true, "ipv4": { "address": "192.168.1.1", "mask": "255.255.255.0" }, "vlans": [10, 20, 30] } } ```
قواعده:
· البيانات أزواج مفتاح: قيمة (key: value). · الكائن (Object) بين { }، والمصفوفة (Array) بين [ ]. · المفاتيح والنصوص بين علامتي اقتباس مزدوجتين. · القيم: نص، رقم، `true/false`، `null`، كائن، مصفوفة. · الفصل بين العناصر بـ فاصلة، وآخر عنصر بلا فاصلة.
YAML
أسهل للقراءة البشرية، ويُستخدم كثيراً في ملفات إعداد الأدوات (مثل Ansible).
```yaml interface: name: GigabitEthernet0/1 description: Uplink to Core enabled: true ipv4: address: 192.168.1.1 mask: 255.255.255.0 vlans: - 10 - 20 - 30 ```
قواعده:
· الهيكلة بـ المسافات البادئة (Indentation) وليس الأقواس. لا تستخدم Tab. · القوائم تبدأ بشرطة `-`. · لا تحتاج غالباً لعلامات اقتباس.
XML
صيغة أقدم تعتمد على الوسوم `<tag>`، وتُستخدم مع NETCONF.
```xml <interface> <name>GigabitEthernet0/1</name> <enabled>true</enabled> </interface> ```
⚠️ فخ في الامتحان: فرّق بين JSON (أقواس وفواصل) و YAML (مسافات وشرطات). الأسئلة غالباً تعرض مقتطفاً وتطلب تحديد الصيغة أو قيمة معينة داخله.
4. واجهات الأتمتة في أجهزة Cisco
| الواجهة | الأسلوب | الصيغة |
|---|---|---|
| RESTCONF | HTTP/HTTPS | JSON أو XML |
| NETCONF | SSH (المنفذ 830) | XML |
| YANG | نموذج بيانات (Data Model) يصف هيكل الإعدادات، ويُستخدم مع الاثنين | — |
💡 YANG هو "المخطط" الذي يصف شكل البيانات، بينما RESTCONF و NETCONF هما "وسيلة النقل".
ما هو Cisco DNA Center؟ وحدة تحكم مركزية (Controller) تعرض REST APIs لإدارة الشبكة وأتمتتها (سنخصص له درساً مستقلاً).
5. أدوات إدارة الإعدادات (Configuration Management)
| الأداة | آلية العمل | اللغة/الملفات |
|---|---|---|
| Ansible | بدون وكيل (Agentless)، يدفع الإعدادات (Push) عبر SSH | Playbooks بصيغة YAML |
| Puppet | بوكيل (Agent)، الجهاز يسحب الإعدادات (Pull) | Manifests |
| Chef | بوكيل (Agent)، الجهاز يسحب الإعدادات (Pull) | Recipes و Cookbooks |
💡 للحفظ: Ansible = بلا وكيل + Push، وPuppet و Chef = وكيل + Pull.
مثال Playbook بسيط في Ansible
```yaml
- name: Configure interface description
hosts: switches gather_facts: no tasks: - name: Set description cisco.ios.ios_config: lines: - description Uplink to Core parents: interface GigabitEthernet0/1 ```
سطر واحد في ملف inventory يحدد الأجهزة المستهدفة، وبتشغيل الـ Playbook يتغير الإعداد على كل الأجهزة معاً.
مفهوم Declarative مقابل Imperative
· Imperative: تصف الخطوات (افعل كذا ثم كذا). · Declarative: تصف الحالة النهائية المطلوبة والأداة تتدبر الطريق (مثل Ansible و Terraform في أغلب الاستخدامات).
6. مثال برمجي بـ Python
```python import requests
url = "https://10.0.0.1/restconf/data/ietf-interfaces:interfaces" headers = {"Accept": "application/yang-data+json"}
response = requests.get(url, headers=headers, auth=("admin", "password"), verify=False)
print(response.status_code) # 200 print(response.json()) ```
· `requests.get`: يرسل طلب GET. · `response.status_code`: رمز الاستجابة. · `response.json()`: يحوّل الاستجابة إلى قاموس Python لتقرأ منه القيم.
⚠️ `verify=False` يعطل فحص الشهادة، ويُقبل في المختبر فقط، ولا يُستخدم في الإنتاج. وتجنب كتابة كلمات السر داخل الكود.
7. أخطاء شائعة
- استخدام Tab بدل المسافات في YAML فيفشل الملف.
- فاصلة زائدة بعد آخر عنصر في JSON.
- خلط PUT (استبدال كامل) مع PATCH (تعديل جزئي).
- تجاهل رمز الاستجابة والاعتماد على الافتراض أن الطلب نجح.
- تخزين كلمات السر نصاً صريحاً في السكربتات أو الـ Playbooks.
8. تحدي عملي 🧪
المطلوب (بدون جهاز حقيقي):
- افتح Cisco DevNet Sandbox وجرّب أحد الأجهزة المتاحة (مثل IOS XE).
- استخدم Postman لإرسال `GET` إلى مسار الواجهات في RESTCONF.
- اقرأ الاستجابة وحدد: اسم إحدى الواجهات وحالتها (`enabled`).
- حوّل نفس البيانات من JSON إلى YAML يدوياً.
- (تحدٍ إضافي): اكتب سكربت Python بسيط يطبع أسماء كل الواجهات فقط.
9. اختبار اليوم 📝
س1: ما الفرق بين PUT و PATCH؟
س2: ماذا يعني رمز الاستجابة 404؟ وماذا يعني 401؟
س3: اذكر قاعدتين تميزان JSON عن YAML.
س4: لماذا يُقال إن Ansible "Agentless"؟ وما الفرق بينه وبين Puppet؟
س5 — تحدي CCNA: ما الصيغة المستخدمة في هذا المقتطف؟ وما قيمة `enabled`؟
``` interface: name: Gi0/1 enabled: true ```
🎯 خلاصة الدرس
· الأتمتة: سرعة ودقة واتساق مقارنة بالإعداد اليدوي. · REST API: يعتمد على HTTP، وStateless، وأفعاله GET و POST و PUT/PATCH و DELETE. · رموز الاستجابة: 2xx نجاح، 4xx خطأ العميل، 5xx خطأ السيرفر. · JSON: أقواس وفواصل وأزواج key:value. YAML: مسافات وشرطات. · RESTCONF: فوق HTTP. NETCONF: فوق SSH بصيغة XML. YANG: نموذج البيانات. · Ansible: بلا وكيل (Push). Puppet/Chef: بوكيل (Pull). · القاعدة الذهبية: ما تكرره أكثر من ثلاث مرات يدوياً، فأتمته.
💬 سؤال للنقاش
لو كلّفك مديرك بتغيير كلمة سر SNMP على 500 جهاز بنهاية اليوم، هل ستفعلها يدوياً أم بالأتمتة؟ وما أول أداة ستختارها ولماذا؟ شاركونا إجاباتكم في التعليقات 👇
#CCNA #NetworkAutomation #REST #API #JSON #YAML #Ansible #Cisco #هندسة_الشبكات
