Python في صندوق أدوات DevOps
Python في صندوق أدوات DevOps
كل مهندس DevOps محترف يحمل صندوق أدوات ذهنياً مُقسَّماً إلى ثلاث طبقات: المنصة (Linux والشبكات والحاويات)، والـ pipeline (أنظمة CI/CD وأدوات IaC)، والغراء. Python هو ذلك الغراء. إنه اللغة التي تقرأ إعداد YAML وتستدعي ثلاث APIs سحابية وتُحوّل النتيجة وتكتب تقريراً وتُرسل تنبيه Slack — كل ذلك في سكريبت واحد يمكنك قراءته بعد ستة أشهر وتفهمه. يشرح هذا الدرس بالضبط لماذا تسود Python أتمتة العمليات وكيف تُعيّن بيئة احترافية قابلة للتكرار منذ اليوم الأول.
لماذا أصبحت Python لغة العمليات
لم تفز Python في مجال العمليات بالصدفة. خصائص ملموسة محددة تجعلها الأداة الصحيحة لعمل البنية التحتية:
- بطاريات مدمجة لمهام العمليات: المكتبة القياسية تحتوي على
osوpathlibوsubprocessوjsonوloggingوargparseوsocketوhttp.clientوthreading— اللبنات الأساسية لتقريباً كل سكريبت عمليات — دون تثبيت أي شيء. - SDKs سحابية من الدرجة الأولى: AWS (boto3) وGCP (google-cloud-*) وAzure (azure-sdk-for-python) وكل بائع SaaS رئيسي يشحن SDKs Python رسمية. هذه يصونها مزودو السحابة أنفسهم لا أغلفة طرف ثالث.
- Ansible وSaltStack وFabric وAirflow كلها Python: فهم اللغة يتيح لك كتابة وحدات مخصصة وتوسيع الأدوات الموجودة وتشخيص الأعطال من المصدر بدلاً من معاملتها كصناديق سوداء.
- مقروء للجميع في الفريق: سطر Shell واحد يربط عشرة أنابيب سريع في الكتابة ومستحيل المراجعة. سكريبت Python بأسماء متغيرات وصفية ودوال وتوثيق يمكن مراجعة كوده واختباره وتعديله بأمان من أي مهندس.
- موجود في كل مكان على خوادم Linux: Python 3 تأتي مع كل توزيعة Linux رئيسية. يمكنك تشغيل سكريبت عمليات على نسخة EC2 طازجة دون أي خطوات تجهيز.
السكريبتات مقابل الأدوات: فهم الطيف
قبل كتابة سطر واحد، قرر ما الذي تبنيه. هذا التمييز يُشكّل كل قرار تصميم يليه.
A script هو ملف واحد يُشغَّل مرة أو بجدول زمني ويحل مشكلة ضيقة واحدة: تدوير مفتاح SSH، أرشفة سجلات قديمة، التحقق من أن جميع pods في namespace بحالة Running. السكريبتات لا تحتوي اختبارات ولا تغليف ولا إصدار يتجاوز git blame. تناسب المهام البسيطة منخفضة الخطورة التي تعمل بشكل غير متكرر.
A tool هو حزمة Python قابلة للتوزيع والتثبيت مع نقطة دخول CLI واختبارات ورقم إصدار وتوثيق. هذا ما يتحول إليه السكريبت حين يحتاج أشخاص آخرون إلى تشغيله، أو حين يحتاج للتعامل مع حالات الحواف بسلاسة، أو حين يؤثر الفشل على الإنتاج. فكر في AWS CLI وkubectl وgh — هذه أدوات مبنية بـ Python (أو مُصرَّفة منها) يشغّلها آلاف المهندسين يومياً.
القاعدة الاستهدافية على نطاق واسع: ابدأ كسكريبت، أعد هيكلته كأداة حين يتبناه الفريق الثاني. يتبع هذا الدرس التعليمي تلك المنحنى — الدروس المبكرة هي سكريبتات، والدروس اللاحقة (الدرس 6) تبني أداة CLI حقيقية.
إعداد البيئة: لماذا venv غير قابل للتفاوض
حين تثبّت حزم Python بشكل عام (مع pip install boto3 على مستوى النظام)، فأنت تُعدّل مترجم Python الذي قد يعتمد عليه نظام التشغيل نفسه. على خادم حقيقي يُسبب هذا تعارضات في التبعيات وانجراف الإصدارات بين المشاريع وأعطالاً حين يُحدّث نظام التشغيل حزمة مشتركة. على runner CI يُسبب بنيات غير قابلة للتكرار — يتصرف نفس السكريبت بشكل مختلف بحسب ما صادف أن ثبّته وظيفة سابقة.
A virtual environment (venv) هو مجلد معزول يحتوي على نسخة Python الخاصة به ومجلد site-packages الخاص به. الحزم المثبتة داخل venv لا تمس نظام Python أبداً وغير مرئية للـ venvs الأخرى على نفس الجهاز. هذا هو الحد الأدنى من النظافة لأي عمل Python جاد، سواء أكان عمليات أم غيرها.
.venv (بالنقطة) وأضفه إلى .gitignore. هذا هو الاتفاق الذي يستخدمه VS Code وPyCharm ومعظم قوالب CI. يُبقي جذر المشروع نظيفاً ويمنع commit غير مقصود لمئات الملفات الثنائية. أضف .venv/ إلى ~/.gitignore_global العالمي أيضاً حتى لا تنسى أبداً.عصر pyproject.toml
لأي شيء يتجاوز سكريبتاً واحداً، المعيار الحديث لـ Python هو pyproject.toml بدلاً من setup.py القديم أو requirements.txt العاري. إنه ملف واحد يُعلن بيانات نظام البناء وتبعيات المشروع بتنسيق موحد (PEP 517/518). الأدوات الرئيسية كـ pip وpoetry وuv وhatch كلها تقرأه.
== في pyproject.toml الخاص بمكتبة — استخدم حدوداً دنيا بـ >= فقط. التثبيت الصارم في مكتبة مشتركة يُسبب جحيم التبعيات حين يحتاج مشروع مستهلك إلى إصدار مختلف من نفس الحزمة. احتفظ بتثبيت == لملفات requirements.txt للتطبيق أو ملفات القفل، حيث تتحكم في البيئة بالكامل. أدوات كـ pip-compile أو uv lock تولّد ملفات قفل قابلة للتكرار دون تلويث بيانات الحزمة.إدارة إصدار Python في الإنتاج
نظام Python على الخادم مملوك لمدير حزم نظام التشغيل. ترقيته للحصول على ميزة لغة جديدة قد يكسر الأدوات المساعدة للنظام التي تعتمد على الإصدار القديم. النهج الاحترافي هو تثبيت إصدارات Python بشكل مستقل باستخدام pyenv أو، في الحاويات، تثبيت إصدار CPython الدقيق في صورة Dockerfile الأساسية.
في pipeline CI، حدد دائماً إصدار Python صراحةً. لا تعتمد أبداً على "أي Python مثبت على الـ runner" — هذا يتغير دون إشعار حين تُحدَّث صورة الـ runner، وفجأة يكسر سكريبتك لأنه استخدم تعبير match يتطلب 3.10+ لكن الـ runner يملك 3.8.
عقلية Python للعمليات
سكريبتات العمليات في الإنتاج تفشل بطرق لا تفشل بها البرامج التفاعلية. سكريبت يعمل في 03:00 يوم السبت يمكنه الفشل بصمت أو إفساد الحالة أو إطلاق حادثة متسلسلة قبل أن يلاحظ أحد. التحول الذهني من "يكتب كوداً" إلى "يكتب كود عمليات" يستلزم استيعاب بعض المبادئ التي ستطبقها طوال هذا الدرس التعليمي:
- افشل بصوت عالٍ لا بصمت: استثناء غير معالج مع تتبع كامل أفضل من سكريبت يبتلع خطأ ويخرج بـ 0. أنظمة المراقبة تكتشف رموز الخروج غير الصفرية؛ لا تستطيع اكتشاف الفشل الصامت.
- قابلية التكرار (Idempotency): تشغيل السكريبت مرتين يجب أن ينتج نفس نتيجة تشغيله مرة واحدة. هذا يجعل إعادة المحاولات آمنة، وهو أمر ضروري لأي عملية يمكن مقاطعتها (انتهاء مهلة الشبكة، SIGTERM من runner CI وصل لحد المهلة).
- التسجيل المنظَّم بدلاً من جُمَل print:
print("done")غير مرئية لمجمّعي السجلات. سطر سجل بتنسيق JSON مع طابع زمني وخطورة وحقول سياق قابل للاستعلام في Datadog أو CloudWatch Logs أو أي SIEM. - بيانات الاعتماد من البيئة لا من الكود: مفاتيح API مُرمَّزة في الكود هي حادثة أمنية P0 تنتظر حدوثها. ستُمارس هذا النمط مراراً عبر هذا الدرس التعليمي.