Terraform / الموديولات والدورة الواعية بالحالة / الدرس 8
عقود الموديولات ونطاق المزود
ابن واجهات صغيرة وميّز حد الابن من فصل الحالة أو الصلاحيات.
في هذه الصفحة
أهداف الدرس
- اشرح المصدر المحلي والعقود وملكية الجذر.
- افصل المتطلبات من إعداد المزود الممرر.
يجمع الموديول الإعداد خلف واجهة
الموديول مجلد ملفات Terraform يقيم كوحدة واحدة. يستدعي الجذر أبناء بمصادر ومعاملات ويستهلك المخرجات المعلنة؛ وليست ملفات الموديول نصوص تنفيذ مستقلة. تحسن الحدود إعادة الاستخدام والمراجعة ولا تنشئ تلقائياً حالة أو قفلاً أو اعتماداً أو موافقة منفصلة. تبقى موارد الأبناء عادة في حالة الجذر. اختر الحدود التشغيلية صراحة ولا تفترض أن بنية المجلدات توفر العزل.
يحدد الجذر حاجة المستهلك
يستدعي الجذر مثالاً محلياً عند ./modules/catalog، ويمرر اسم خدمة معبراً ويعيد واجهة اسم ضيقة. يتطلب المسار ملفات الابن التالية ولا يمثل تنزيل سجل. يخص معامل version مصادر السجل المدعومة لا هذا المسار. افصل سياسة مصدر الموديول وإصداره عن قفل المزود الذي لا يثبت الإصدارات البعيدة للموديولات. لا تحدث تهيئة أو تشغيل هنا.
terraform {
required_version = ">= 1.16.0, < 1.17.0"
}
module "catalog" {
source = "./modules/catalog"
service_name = "atlas-api"
}
output "catalog_name" {
value = module.catalog.name
}
ينشر المستدعي الاسم لا كل الخصائص، ويصرح بالمصدر والواجهة. هو جذر وابن لا حالتان مستقلتان أو سحابتان.
اجعل واجهة الابن أصغر من تنفيذه
يعلن الابن نوع المدخل وقاعدته، ويحفظ بيانات اصطناعية بمورد مدمج ويعيد قيمة واحدة. الأسماء الداخلية تفاصيل تنفيذ، لكن عناوين حالتها مهمة للترحيل. قد يكسر تغيير نوع المخرج أو التحقق المستدعي دون تغيير العدد. راجع التوافق من منظور المستهلك ووثق التركيبات غير المدعومة. ينبغي أن يمثل الموديول قرارات مقصودة، لا تغليف كل خاصية مزود بمتغير مماثل.
variable "service_name" {
type = string
nullable = false
validation {
condition = startswith(var.service_name, "atlas-")
error_message = "Service names must start with atlas-."
}
}
resource "terraform_data" "this" {
input = { name = var.service_name }
}
output "name" {
value = terraform_data.this.input.name
}
موضع الملف modules/catalog. يوافق atlas-api الشرط ويعاد منطقياً عبر الواجهة دون ادعاء تطبيق أو عرض فعلي. راجع التفرد وقيود المزود مستقلة.
تعبر المتطلبات والإعدادات الحدود بصورة مختلفة
يعلن كل موديول مصادر المزود وتوافقها. تحمل إعدادات المزود الحساب والمنطقة والوجهة وتملكها عادة الجذور، ثم تمررها للأبناء بالوراثة المدعومة أو الربط الصريح. تحتاج aliases توصيلاً وتصريحات مناسبة في الابن، وليست إصدار إضافة آخر. تحقق مما يتلقاه الابن فعلياً؛ فقد يصح مصدره ويخطئ هدف التنفيذ أو هويته.
لا تزيل إعادة الاستخدام مسؤولية الدورة
قد يغير تحديث الموديول الافتراضات والهويات ومتطلبات المزود والعقود والدورة. راجع المقترح الكامل ضمن حالة الجذر وسياقه لا رقم المصدر وحده. حافظ على تماسك يسمح بفهم الملكية والفشل والاختبار. إذا احتاجت الفرق حالة أو قفلاً أو اعتماداً أو زمن نشر مستقلاً، ففكر بجذور منفصلة ونشر بيانات صريح. لا تحقق كثرة الأبناء هذه الضمانات وحدها.
الأخطاء الشائعة وإصلاحها
Unsupported argument at a module call.
- لماذا يحدث؟
- يمرر المستدعي اسماً غير معلن في الابن.
- كيف تصلحه؟
- طابق الاستدعاء مع عقد النسخة المختارة.
- كيف تتجنب تكراره؟
- راجع الواجهة والإصدار معاً.
يستخدم الابن إعداد مزود غير مقصود.
- لماذا يحدث؟
- افتُرضت الوراثة أو ربط alias دون مراجعة.
- كيف تصلحه؟
- افحص الربط والهدف المقصود.
- كيف تتجنب تكراره؟
- وثق ملكية المزود منفصلة عن المصدر.
اعتبار مجلد الموديول فصلاً للحالة.
- لماذا يحدث؟
- اختلط التنظيم بملكية الجذر والخلفية.
- كيف تصلحه؟
- اختر جذوراً صريحة عند الحاجة للاستقلال.
- كيف تتجنب تكراره؟
- ارسم الحالة والقفل والاعتماد والنشر قبل التقسيم.
اختبر فهمك
1. أين تتبع كائنات terraform_data في المثال؟
اعرض الحل المشروح
تتبع حالة الجذر بعناوين تضم مسار الموديول. لا ينشئ المصدر المحلي خلفية أو موافقة مستقلة. افهم الدورة المشتركة قبل التوسيع.
2. لماذا تعيد name لا كائن terraform_data.this كله؟
اعرض الحل المشروح
تحدد الواجهة ما يعتمد عليه المستدعي وتترك الداخل للتطور. يربط الكائن الواسع بالتفاصيل والمخطط. اختر عقداً مستقراً ورقم الكسر عمداً.
أهم ما تعلمته
- حد الابن واجهة لا عزل تشغيل تلقائياً.
- رقم المدخل والمخرج والمصدر وربط المزود كعقود.