أتمتة الشبكة: مصدر الحقيقة والقوالب والفحص قبل التغيير
درس 3 من 4
3أتمتة الشبكة: مصدر الحقيقة والقوالب والفحص قبل التغيير
الصورة الكبيرةتغيير كلمة مرور SNMP على 300 مبدّل يدويًا يأخذ أسبوعًا، ويضمن خطأً في واحد منها على الأقل. بالأتمتة يأخذ دقائق، وكل الأجهزة متطابقة. لكن الأتمتة تضخّم كل شيء، الأخطاء أيضًا: سكربت خاطئ يكسر 300 جهاز معًا. لهذا لا تكتب سكربتًا أسرع، بل نظامًا أدق: بيانات صحيحة، ومقارنة، وفحوص، ومراجعة.
ماذا تشاهد في الرسم: البيانات تولّد الإعدادات، والإعدادات المولدة تُقارن بالجارية، والفرق يُراجع ويُفحص، ثم يُدفع، ثم يُتحقق أن الشبكة بالحالة المطلوبة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
فكّر في مطعم كبير. الطاهي المبتدئ يطبخ كل طبق من ذاكرته فيختلف كل يوم. المطعم المحترف عنده وصفة مكتوبة لكل طبق (القالب)، وقائمة مخزن دقيقة (مصدر الحقيقة)، ومذاق قبل أن يخرج الطبق (الفحص). الأتمتة هي مطبخ الشبكة المحترف: لا أحد يكتب الإعدادات من ذاكرته على الجهاز مباشرة.
مصدر الحقيقة (مثل NetBox) يحفظ الأجهزة والمنافذ والـ VLANs والعناوين، والإعدادات تُشتق منه بقوالب (Jinja2 غالبًا). Idempotency: تشغيل الأداة مرتين يعطي النتيجة نفسها، لأنها تطبق الفرق فقط. الاتصال: SSH/CLI عبر Netmiko للأجهزة القديمة، وNETCONF (RFC 6241، على TCP 830) وRESTCONF (RFC 8040، على HTTPS) ببيانات منظّمة وفق نماذج YANG (RFC 7950)، مع commit وrollback في كثير من الأنظمة. Ansible يصف الحالة المطلوبة في YAML بلا وكيل على الجهاز. الدورة كأنها CI: التغيير في Git، ومراجعة، وفحص ثابت للإعدادات (مثل Batfish)، وتجربة في containerlab، ثم الدفع مع فحوص قبل وبعد (الجيران، والطرق، والمنافذ).
قبل أن تبدأ
🌐الشبكات الحديثة
عرفت SDN والأتمتة باختصار.
🐍أساسيات بايثون
تكتب حلقة ودالة وتقرأ قاموسًا.
الفكرة الجوهرية
1مصدر الحقيقة: البيانات قبل الأوامر
أول سؤال في الأتمتة ليس «أي أداة؟» بل «أين الحقيقة؟». لو كانت في رؤوس الناس وفي جداول Excel متفرقة، فكل سكربت سيبني على بيانات خاطئة. ضع الأجهزة وأدوارها ومنافذها وVLANs والعناوين في نظام واحد مثل NetBox، واجعل الإعدادات تُولّد منه. بعدها أي تغيير يبدأ بتعديل البيانات، لا الجهاز.
أضف VLAN 30 إلى sw-br1-acc2 في البيانات وشغّل: الإعداد يتغير وحده. هذه الفكرة كلها.
from string import Template
truth = { # what NetBox would return for one branch
"sw-br1-acc1": {"mgmt": "10.99.1.11", "vlans": {10: "STAFF", 20: "VOICE", 30: "GUEST"}, "uplinks": ["te1/1/1", "te1/1/2"]},
"sw-br1-acc2": {"mgmt": "10.99.1.12", "vlans": {10: "STAFF", 20: "VOICE"}, "uplinks": ["te1/1/1"]},
}
SNMP = Template("snmp-server group NMS v3 priv\nsnmp-server host 10.99.0.5 version 3 priv $user")
def render(name, dev):
lines = [f"hostname {name}", f"ip default-gateway {dev['mgmt'].rsplit('.', 1)[0]}.1"]
lines += [f"vlan {vid}\n name {label}" for vid, label in sorted(dev["vlans"].items())]
allowed = ",".join(str(v) for v in sorted(dev["vlans"]))
for port in dev["uplinks"]:
lines += [f"interface {port}", " switchport mode trunk", f" switchport trunk allowed vlan {allowed}"]
lines.append(SNMP.substitute(user="netops"))
return "\n".join(lines)
print(render("sw-br1-acc2", truth["sw-br1-acc2"]))2الفرق قبل الدفع، وعدم التكرار
لا تدفع الإعداد كاملًا على الجهاز. قارن المطلوب (المولّد من البيانات) بـ الجاري (من الجهاز)، واعرض الفرق فقط ليراه زميل. وإن شغّلت الأداة مرة ثانية بلا تغيير في البيانات، يجب ألا تفعل شيئًا. هذا idempotency، وهو ما يجعل تشغيل الأتمتة كل ليلة آمنًا لاكتشاف أي تغيير يدوي تسلل (drift).
الفرق يكشف VLAN تجريبية نُسيت وكلمة community قديمة. هذه تُراجع قبل أي دفع.
import difflib
running = """hostname sw-br1-acc2
vlan 10
name STAFF
vlan 20
name VOICE
vlan 99
name TEMP-TEST
snmp-server community public RO""".splitlines()
desired = """hostname sw-br1-acc2
vlan 10
name STAFF
vlan 20
name VOICE
snmp-server group NMS v3 priv""".splitlines()
diff = list(difflib.unified_diff(running, desired, "running", "desired", lineterm="", n=0))
print("\n".join(diff) if diff else "no change: nothing to push")
drift = [l[1:] for l in diff if l.startswith("-") and not l.startswith("---")]
print("\ndrift found (someone changed it by hand):", drift)3كيف تتكلم الأداة مع الجهاز؟
ثلاث طرق. CLI عبر SSH (Netmiko): تعمل مع كل جهاز تقريبًا، لكنك تقرأ نصًا مصممًا للبشر. NETCONF على TCP 830: بيانات XML منظّمة وفق نموذج YANG، وتغيير يُطبق كاملًا أو لا يُطبق (commit). RESTCONF: نفس نماذج YANG عبر HTTPS وJSON. القاعدة: البيانات المنظّمة أفضل دائمًا من قراءة النص بالتعابير النمطية.
| الطريقة | النقل | البيانات | متى |
|---|---|---|---|
| CLI + Netmiko | SSH 22 | نص للبشر | الأجهزة القديمة والمهام السريعة |
| NETCONF | SSH 830 | XML وفق YANG | تغييرات بمعاملة كاملة وrollback |
| RESTCONF | HTTPS 443 | JSON أو XML وفق YANG | التكامل مع تطبيقات الويب |
| gNMI | gRPC | Protobuf وفق YANG | القياس المتدفق والإعداد |
# Ansible: describe the wanted state, run it twice, the second run changes nothing
- name: Branch access switches
hosts: branch1_access
gather_facts: false
tasks:
- name: VLANs from the source of truth
cisco.ios.ios_vlans:
config: "{{ vlans }}"
state: merged
- name: Save only when something changed
cisco.ios.ios_config:
save_when: changed4فحص قبل وبعد، ومختبر قبل الإنتاج
كل تغيير آلي يمر بأربع بوابات: مراجعة الفرق في Git بعين زميل، وتجربة في مختبر containerlab يشغّل أنظمة أجهزة حقيقية في حاويات، وفحص قبل يسجل الحالة (جيران OSPF وBGP، وعدد الطرق، والمنافذ العاملة)، وفحص بعد يقارن بها. إن نقص جار أو طريق، تراجع آليًا. وابدأ رحلتك بمهام قراءة فقط: جرد، ونسخ احتياطي للإعدادات، وتقرير.
سقوط أكثر من 5% من الطرق أو فقد جار يكفي للتراجع. القاعدة تُكتب قبل التغيير لا بعده.
before = {"ospf_neighbours": {"10.0.0.1", "10.0.0.2"}, "bgp_up": 2, "routes": 812, "ports_up": 44}
after = {"ospf_neighbours": {"10.0.0.1"}, "bgp_up": 2, "routes": 640, "ports_up": 44}
problems = []
lost = before["ospf_neighbours"] - after["ospf_neighbours"]
if lost:
problems.append(f"lost OSPF neighbour(s): {sorted(lost)}")
if after["bgp_up"] < before["bgp_up"]:
problems.append("a BGP session dropped")
if after["routes"] < before["routes"] * 0.95:
problems.append(f"routes fell {before['routes']} -> {after['routes']}")
if after["ports_up"] < before["ports_up"]:
problems.append("ports went down")
print("ROLL BACK:\n - " + "\n - ".join(problems) if problems else "change verified")مثال محلول
المسألة: الإدارة تريد تغيير خوادم NTP على 120 مبدّلًا في 6 فروع خلال أسبوع، دون أي انقطاع. اكتب الخطة.
الحل: (1) عدّل خوادم NTP في مصدر الحقيقة. (2) القالب يولّد سطري NTP الجديدين، والأداة تعرض الفرق لكل جهاز، ويراجعه زميل في طلب دمج على Git. (3) جرّب على مبدّلين في containerlab. (4) فحص قبل: show ntp status وshow clock. (5) ادفع لفرع واحد، ثم فحص بعد: الساعة متزامنة وstratum سليم. (6) إن نجح، باقي الفروع على دفعتين. (7) شغّل الأداة مرة أخرى: يجب أن تقول «لا تغيير». ووثّق كل ذلك في طلب الدمج.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| الأتمتة ستلغي وظيفة مهندس الشبكات. | تلغي النسخ واللصق المتكرر، وترفع قيمة من يفهم الشبكة ويكتب الكود معًا. |
| الأتمتة تعني سكربت بايثون كبير. | الأتمتة نظام: بيانات وقوالب ومراجعة وفحوص. السكربت جزء صغير منه. |
| الأتمتة خطرة على الإنتاج. | الخطر في التغيير اليدوي غير المراجع. الأتمتة مع الفحوص أكثر أمانًا وأسهل تراجعًا. |
أين تقابله في العمل
🔐امتثال الأمن
تقرير ليلي يكشف أي جهاز ما زال بكلمة community قديمة.
🏗️فرع جديد
إعدادات كل أجهزة الفرع تتولد من البيانات في دقائق.
💾النسخ الاحتياطي
نسخ إعدادات كل الأجهزة إلى Git كل ليلة، فترى من غيّر ماذا ومتى.
اختبر فهمك
ما أول خطوة في مشروع أتمتة ناجح؟
كل ما يُولَّد يأتي من البيانات؛ البيانات الخاطئة تعني إعدادات خاطئة على كل الأجهزة.
على أي منفذ يعمل NETCONF افتراضيًا؟
NETCONF فوق SSH على المنفذ 830 (RFC 6242).
ماذا يعني idempotency في الأتمتة؟
الأداة تطبق الفرق فقط، فإن لم يوجد فرق لم تفعل شيئًا.
ما الذي يصف بنية البيانات في NETCONF وRESTCONF؟
YANG لغة نمذجة تحدد الحقول وأنواعها، فتصبح البيانات قابلة للفحص.
بعد تغيير آلي، فقد الموجّه جار OSPF واحدًا. ماذا تفعل الأداة الجيدة؟
الفحص بعد التغيير يقارن بالحالة قبله، وأي نقص سبب للتراجع.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا تعرض الفرق بدل الإعداد الكامل للمراجعة؟
لأن الزميل يرى ما سيتغير فعلًا في سطور قليلة، ولا يضيع في ألف سطر لم تتغير.
بماذا تبدأ إن كانت شركتك لم تؤتمت شيئًا بعد؟
بمهام القراءة: جرد الأجهزة، ونسخ الإعدادات إلى Git كل ليلة، وتقرير عن الامتثال.
ما فائدة تشغيل الأداة كل ليلة حتى بلا تغييرات؟
لتكشف drift: أي تغيير يدوي ابتعد بالجهاز عن الحالة المطلوبة.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
أدوات2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.