Terraform / الموديولات والدورة الواعية بالحالة / الدرس 9
مصادر البيانات والقيم المجهولة
ميّز قراءة المعلومات عن ملكيتها وافصل المجهول المقبل من null والخطأ.
في هذه الصفحة
أهداف الدرس
- اشرح توقيت قراءة البيانات في الخطة أو التطبيق.
- صمم هويات معلومة دون تخمين المجهول.
قراءة الكائن ليست إعلان دورته
يعلن المورد المُدار ملكية الدورة، بينما يسترجع مصدر البيانات معلومات بواجهة قراءة يحددها المزود. لا تجعلك قراءة خدمة مسؤولاً عن إنشائها أو حذفها. يحدد العقد معاملات البحث والوصول والفشل والتوقيت. وقد تشمل القراءات واجهات بعيدة أو برامج خارجية مدعومة، فلا تكون ساكنة تلقائياً. راجع ثقة المصدر وسلطة التنفيذ حتى حين لا تقصد تغيير مورد مُدار.
تحتاج القراءة إلى عقد ملكية ووصول
يوضح terraform_remote_state المدمج الاعتماد على مخرجات إعداد آخر. يفترض الجذر التوضيحي لقطة محلية مملوكة مستقلاً عند المسار، ولا نقدمها أو نقرأها. لا يصبح النشر آمناً لمجرد صغر المخرج؛ فقد يكشف الوصول للحالة أكثر من المختار. راجع الخلفية والهوية والأسماء والصلاحيات والتوافق قبل أي تقييم مصرح.
terraform {
required_version = ">= 1.16.0, < 1.17.0"
}
data "terraform_remote_state" "catalog" {
backend = "local"
config = { path = "catalog-upstream.tfstate" }
}
output "upstream_name" {
value = data.terraform_remote_state.catalog.outputs.name
}
يتطلب الإعداد حالة معتمدة بمخرج name ولا ينشئها أو يخولها تلقائياً. لا ينفذ HCL ولا يفتح المسار. يختلف غياب المخرج عن اختيار الحالة الخطأ.
تؤثر المعاملات المعلومة والتغييرات في وقت القراءة
يقرأ Terraform المصدر عادة أثناء الخطة حين تتوفر المدخلات المطلوبة، لكن الاعتماد أو معاملات مجهولة قد تؤجل النتيجة للتطبيق. لا تفترض معرفة كل بيانات الخطة. وقد توسع depends_on التحفظ بلا ضرورة. يمثل المجهول معلومة غير متاحة بعد لا خطأ أو غياباً بالضرورة. احفظ النوع والاعتماد، وأبق قرارات هوية النسخ متاحة في المرحلة التي تحتاجها.
مثل الغموض دون ادعاء تقييم HCL
يمثل Python قيمة غير متاحة بعلامة خاصة، ويفصلها من مجموعة أسماء معلومة. هذا تمثيل تعليمي لا مقيّم تعبيرات Terraform أو قواعد null أو جدولة مزود. تستطيع الأسماء الثابتة دعم الهوية رغم غياب المعرّف. يمحو استبداله بفراغ فرق المجهول من القيمة الفارغة صراحة، وقد يخفي اعتماداً حقيقياً بدلاً من حله.
unknown = object()
service_names = {'api': {}, 'worker': {}}
generated_id = unknown
print('known_keys=' + ','.join(sorted(service_names)))
print(f'generated_id_known={generated_id is not unknown}')
known_keys=api,worker
generated_id_known=False
يبقى api و worker معلومين وتمثل العلامة غياب المعرّف. لا يقرأ البرنامج حالة أو مزوداً ولا يخترع هوية، بل يوضح توفر المعلومات فقط.
فضل نشراً صريحاً ضيقاً عند فصل الملكية
حدد مع المالك الآخر عقد نشر ووصول مستقراً بدلاً من ربط المستهلك بتمثيل حالة خاصة كامل. وضح النوع والحداثة وسلوك الغياب والمصادقة. قد تعيد القراءة الناجحة معلومة قديمة أو غير مقصودة؛ فتحقق من البيئة والهوية وافصل نجاح البحث عن الجاهزية. اختبر الغياب والتغيير وعدم التوافق كي يفشل المستهلك بوضوح لا يختار تخميناً أو يدير ما أراد رصده فقط.
الأخطاء الشائعة وإصلاحها
Unsupported attribute on an upstream output.
- لماذا يحدث؟
- لا تنشر الحالة الاسم أو البنية المطلوبة.
- كيف تصلحه؟
- تحقق من هوية الحالة وعقد المخرج.
- كيف تتجنب تكراره؟
- اختبر التوافق قبل الاستهلاك.
استبدال معرّف مجهول بنص فارغ.
- لماذا يحدث؟
- خُلطت المعلومة المقبلة بالغياب الاختياري.
- كيف تصلحه؟
- احفظ الاعتماد وأعد قرارات الهوية المرحلية.
- كيف تتجنب تكراره؟
- اختبر المجهول و null والمفقود والفراغ منفصلة.
افتراض أن قراءة البيانات لا تحتاج تصريحاً.
- لماذا يحدث؟
- أُهمل تفاعل المزود أو الخلفية أو البرنامج.
- كيف تصلحه؟
- أثبت المصدر والوصول قبل التقييم.
- كيف تتجنب تكراره؟
- راجع القراءة والاعتماد كحدود تشغيل.
اختبر فهمك
1. هل تبقى المفاتيح ثابتة مع معرّف مجهول؟
اعرض الحل المشروح
نعم إذا اشتقت من مدخل معلوم لا المعرّف. ضع المستقبل في قيم تستهلك بمرحلتها. يظل الإعداد محتاجاً تحقق Terraform وتقييم اعتماده.
2. هل تمنح قراءة المخرجات وصولاً إليها وحدها؟
اعرض الحل المشروح
ليس تلقائياً؛ فقد يكشف وصول الخلفية الحالة وخصائص حساسة. اختر النشر من حد السرية، فلا ينشئ التعبير الضيق صلاحية تخزين ضيقة.
أهم ما تعلمته
- يرصد مصدر البيانات بعقد ولا يعني الملكية.
- يتطلب المجهول تصميماً مرحلياً لا تخميناً.