متغيرات البيئة والضبط
متغيرات البيئة والضبط
كل عملية على لينوكس ترث مجموعة من متغيرات البيئة — أزواج مسمّاة من مفتاح وقيمة تضبط سلوك تشغيل العملية دون الحاجة إلى ترميز القيم الثابتة داخل البرنامج نفسه. متغيرات البيئة هي الطريقة التي تخبر بها عميل قاعدة البيانات بالمضيف الذي يتصل به، وكيف تُضخّ الأسرار في الحاويات دون تسجيلها في التحكم في المصدر، وكيف تعرف الصدفة أين تجد كل أمر تكتبه. فهمها بعمق أمر لا تهاون فيه في عمل DevOps الإنتاجي.
ما هي متغيرات البيئة وكيف تعمل
حين تُفرّع النواة عملية جديدة، تمرر إليها شيئين: وسيطاتها (argv) وبيئتها (envp) — مصفوفة من سلاسل KEY=VALUE منتهية بـ null. يمكن للعملية الابنة قراءة أي من هذه السلاسل، وترث نسخة كاملة من بيئة الأب. والأهم: العملية الابنة لا ترى سوى نسختها الخاصة؛ التغييرات التي تُجريها الابنة لا تعود للأعلى إلى الأب. هذا مبدأ تصميمي أساسي في Unix: البيئة تُورَث للأسفل، ولا تُورَث أبداً للأعلى.
اقرأ متغيرات البيئة وتحكم فيها بهذه الأوامر الأساسية:
VAR=value command (بدون export) يُعيّن المتغير لاستدعاء ذلك الأمر الواحد فقط. إنها أنظف طريقة للاختبار بضبط مختلف دون تلويث جلسة الصدفة. السكريبتات الإنتاجية تستخدم هذا النمط بكثرة.
متغير PATH — أهم متغير في أي نظام
PATH قائمة مجلدات مفصولة بنقطتين تبحث فيها الصدفة، بالترتيب، حين تكتب اسم أمر بدون مسار. حين تكتب docker، تمشي الصدفة عبر كل مجلد في PATH وتُنفّذ أول تطابق تجده. إن لم يُوجد تطابق، ستحصل على command not found.
curl محلياً يحتوي على رايات debug ويُضيف مجلده في المقدمة، ثم خدمة systemd تستدعي curl فتلتقط بناء debug وتفشل بصمت. دائماً اعرف أي ملف ثنائي يفوز بـ which <command>.
ملفات الإعداد وأسبقية التكوين
تقرأ الصدفة ملفات تكوين مختلفة حسب طريقة تشغيلها. الخطأ في هذا مصدر كثير من أخطاء "تعمل على جهازي، تنكسر في cron / CI / SSH". هناك محوران:
- صدفة تسجيل الدخول مقابل صدفة غير تسجيل الدخول: صدفة تسجيل الدخول هي أول جلسة صدفة تبدأ حين تُسجّل الدخول — مثل تسجيل دخول SSH، أو
su - username. صدفة غير تسجيل الدخول هي أي صدفة لاحقة — مثل فتح تبويب طرفية جديد، أو تشغيلbashمن داخل سكريبت آخر. - صدفة تفاعلية مقابل غير تفاعلية: الصدفة التفاعلية لديها طرفية متصلة وتستطلع المستخدم. الصدفة غير التفاعلية تُشغّل سكريبتاً وتخرج — هذا ما تستخدمه مهام cron ومُشغّلات CI.
القواعد العملية لمكان وضع كل شيء:
/etc/profileو/etc/profile.d/*.sh: إعدادات على مستوى النظام تُطبَّق على كل مستخدم عند تسجيل الدخول. في الإنتاج، تكتب أدوات إدارة التكوين (Ansible وPuppet) هنا لضبط إضافات PATH أو إعدادات البروكسي على مستوى الأسطول. لا تضع أسراراً هنا أبداً.~/.bash_profile(أو~/.profile): لكل مستخدم، عند تسجيل الدخول فقط. المكان المعياري لتعيين وتصدير متغيرات البيئة التي تحتاجها الأدوات في كل مكان (مثلGOPATHوJAVA_HOMEوNVM_DIR). بالاتفاق، يُضمّن هذا الملف~/.bashrcحتى تستفيد منه الصدفات التفاعلية أيضاً.~/.bashrc: لكل مستخدم، للصدفة التفاعلية غير صدفة تسجيل الدخول. الأسماء المستعارة، ووظائف الصدفة، وتخصيص سطر الأوامر، والإكمالات تذهب هنا. لا تضع أوامر طويلة التشغيل أو عمليات حسابية ثقيلة هنا — يُشغَّل عند كل تبويب طرفية جديد./etc/environment: ملف يقرأه PAM. أزواج مفتاح-قيمة، بدون صياغة صدفة. المتغيرات المُعيَّنة هنا متاحة لجميع العمليات التي يبدأها PAM (تسجيل الدخول، SSH، الجلسات الرسومية) بصرف النظر عن الصدفة التي يستخدمونها. مثالي لـLANGوTZوإعدادات البروكسي أو رايات الميزات التي يجب أن تراها كل عملية على المضيف.
تطبيق التغييرات بدون إعادة التشغيل
بعد تعديل ملف الإعداد، لا تُحدَّث جلسة الصدفة الحالية تلقائياً. لديك خياران:
source ~/.bashrc(أو الاختصار بنقطة:. ~/.bashrc) — يُعيد تنفيذ الملف في الصدفة الحالية. تسري التغييرات فوراً دون فتح طرفية جديدة.- فتح صدفة جديدة — صدفة تسجيل دخول جديدة ستقرأ جميع ملفات الإعداد من الصفر.
في الأتمتة الإنتاجية (مثل مهمة CI تُثبّت أداة ثم تستخدمها في نفس السكريبت)، يجب عليك source للملف أو تعيين المتغير صراحةً — العملية الفرعية الجديدة لا ترث التغييرات التي أجراها السكريبت الأب على ملف لم يُضمَّن بعد.
متغيرات البيئة في الأنظمة الإنتاجية
في البيئات السحابية وبيئات الحاويات، متغيرات البيئة هي الآلية الأساسية لحقن التكوين أثناء التشغيل. منهجية Twelve-Factor App (فلسفة التصميم وراء معظم الخدمات السحابية الحديثة) تُلزم بوضع كل التكوين في البيئة، لا في ملفات التكوين المدمجة في الصورة.
echo $DB_PASSWORD أو set -x (التي تطبع كل أمر ومتغيراته الموسَّعة). تسرب الأسرار في سجلات CI من أكثر الحوادث الأمنية شيوعاً في مؤسسات الهندسة. استخدم printenv DB_PASSWORD | wc -c للتحقق من تعيين سر دون الكشف عن قيمته.
تشخيص مشاكل البيئة
حين لا تجد خدمة أو سكريبت ملفاً ثنائياً، أو تفشل في الاتصال بقاعدة البيانات، أو تتصرف بشكل مختلف في CI عن جهازك المحمول، غالباً ما تكون متغيرات البيئة هي السبب. نهج تشخيص منهجي:
PATH سوى /usr/bin:/bin، ولا ملف إعداد مستخدم مُضمَّن، ولا HOME في بعض الإصدارات. سكريبت يستدعي docker أو terraform بدون PATH كامل سيفشل بصمت. أصلح ذلك إما بتضمين الملف الشخصي في أعلى السكريبت (source /etc/profile) أو باستخدام مسارات مطلقة. وبالمثل، ملفات وحدة systemd لا ترث بيئة المستخدم التفاعلية؛ عيّن توجيهات Environment= أو EnvironmentFile= في كتلة [Service] صراحةً.
المتغيرات الحساسة وآداب الأمان
متغيرات البيئة مرئية لأي شخص يمكنه قراءة /proc/<pid>/environ، وهو مقيّد افتراضياً لمالك العملية و root. لكنها يمكن أن تتسرب عبر:
- التسجيل المفصّل (مثل
set -xفي سكريبتات الصدفة، أو middleware التصحيح في أطر الويب) - صفحات الخطأ التي تُفرغ البيئة
- ناتج
ps auxإن مُرّر السر كوسيط سطر أوامر بدلاً من متغير بيئة - ناتج Docker inspect وأوصاف pod في Kubernetes (لمتغيرات البيئة، ليس الأسرار المُركَّبة كملفات)
لأي شيء حساس حقاً (كلمات المرور، رموز API، المفاتيح الخاصة)، افضّل أنظمة إدارة الأسرار — HashiCorp Vault، أو AWS Secrets Manager، أو Kubernetes Secrets مدعومة بمخزن أسرار مُشفَّر — وأدخلها كملفات في /run/secrets/، لا كمتغيرات بيئة كلما أمكن. كحد أدنى، لا تُودّع ملفات .env أبداً في التحكم في المصدر.