هذه هي وحدة Terraform فقط (أي ، وحدة لا تقوم بأي مكالمات API عن بُعد) تجمع جميع الملفات تحت دليل أساسي معين ويجعل تلك التي لديها لاحقة معينة كملفات قالب Terraform.
module "template_files" {
source = " hashicorp/dir/template "
base_dir = " ${ path . module } /src "
template_vars = {
# Pass in any values that you wish to use in your templates.
vpc_id = " vpc-abc123 "
}
} إخراج files عبارة عن خريطة من مسارات الملفات المتعلقة بالدليل الأساسي للكائنات ذات السمات التالية:
content_type : نوع MIME لاستخدامه في الملف.content : المحتوى الحرفي للملف ، بعد تقديم قالب.source_path : موقع نظام الملفات المحلي لملف غير مملوك.digests : خريطة تحتوي على نتائج تطبيق خوارزميات Digest/Hash المختلفة على محتوى الملف. content و source_path حصريين بشكل متبادل. تم تعيين content لملفات القالب ويحتوي على نتيجة تقديم القالب. بالنسبة للملفات غير المملوءة ، يتم تعيين source_path على موقع الملف على القرص المحلي ، والذي يتجنب محاولة تحميل ملفات غير UTF-8 مثل الصور في الذاكرة.
تحتوي خريطة digests لكل ملف على المفاتيح التالية ، التي تكون قيمها نتيجة لتطبيق وظيفة التجزئة المسماة على محتويات الملف:
md5sha1sha256base64sha256base512base64sha512 بشكل افتراضي ، يتم تفسير أي ملف في الدليل الأساسي الذي ينتهي اسم الملف في .tmpl كقالب. يمكنك تجاوز هذه اللاحقة عن طريق تعيين template_file_suffix المتغير إلى أي سلسلة تبدأ بفترة وتتبعها حرف واحد أو أكثر من غيرها.
يتم تفسير القوالب على أنها بناء جملة قالب سلسلة Terraform. يمكن للقوالب استخدام أي من الوظائف المدمجة في Terraform باستثناء وظيفة templatefile ، وهو ما تستخدمه هذه الوحدة لتقديم القالب داخليًا.
سيتم التعامل مع أي ملف لا يحتوي على لاحقة ملف القالب كملف ثابت ، وإرجاع المسار المحلي إلى الملف المصدر.
يتم تحديد قيم نوع المحتوى ( content_type في الكائنات الناتجة) بناءً على لاحقة جميع الملفات المكتشفة.
file_types المتغير عبارة عن رسم خرائط من لاحقة اسم الملف (نقطة تليها حرف واحد على الأقل من النقاط) لقيم رأس Content-Type . يتضمن التعيين الافتراضي عددًا من الأنماط الشائعة الاستخدام على مواقع الويب الثابتة.
إذا واجهت الوحدة ملفًا لا يحتوي على لاحقة على الإطلاق أو لم يكن لاحقة في file_types ، فسيستخدم قيمة default_file_type المتغير كإرجاع ، والذي يتخلف عن application/octet-stream في حد ذاته.
تتمثل مجموعة الاستخدام الرئيسية لهذه الوحدة في إنتاج محتوى للتحميل في دلو Amazon S3 ، على سبيل المثال لاستخدامه كموقع ويب ثابت.
في وحدة الاتصال الخاصة بك ، استخدم aws_s3_bucket_object من مزود AWS مع for_each لإنشاء كائن S3 لكل ملف:
resource "aws_s3_bucket_object" "static_files" {
for_each = module . template_files . files
bucket = " example "
key = each . key
content_type = each . value . content_type
# The template_files module guarantees that only one of these two attributes
# will be set for each file, depending on whether it is an in-memory template
# rendering result or a static file on disk.
source = each . value . source_path
content = each . value . content
# Unless the bucket has encryption enabled, the ETag of each object is an
# MD5 hash of that object.
etag = each . value . digests . md5
}يشبه نمط تحميل الملفات إلى GCS إلى حد كبير لنمط Amazon S3 أعلاه:
resource "google_storage_bucket_object" "picture" {
for_each = module . template_files . files
bucket = " example "
name = each . key
content_type = each . value . content_type
# The template_files module guarantees that only one of these two attributes
# will be set for each file, depending on whether it is an in-memory template
# rendering result or a static file on disk.
source = each . value . source_path
content = each . value . content
}تتطلب هذه الوحدة terraform v0.12.8 أو أحدث. لا يستخدم أي مقدمي خدمات Terraform ، ولا يعلن أي موارد terraform.
template_dir ؟ تم تنفيذ نوع مورد template_dir كحل براغماتية لقيود مختلفة في الإصدارات السابقة من terraform ، ولكنه يمثل مشكلة لأنه ينتهك افتراضًا يقوم به terraform حول الموارد: إنه يعدل الحالة المحلية على النظام الذي يعمل فيه Terraform ، وبالتالي نتيجة المورد غير مرئي عند تشغيل terraform على المضيفين الآخرين.
لم يعد نوع مورد template_dir ضروريًا من Terraform 0.12.8 فصاعدًا لمعظم حالات الاستخدام ، لأن هناك وظائف مدمجة كافية للحصول على نتائج مماثلة بدون موارد على الإطلاق.
بالإضافة إلى أن هذه الوحدة هي مواطن أفضل في سير عمل Terraform من مورد template_file ، فإنه يسمح أيضًا بمزيج من الملفات وغير المسبقة في نفس الدليل ، وسيحمل فقط في الذاكرة وتقديم ملفات القالب. بالنسبة للملفات غير المملوءة ، سيتركها على القرص حيث تكون وإرجاع مسار نظام الملفات المحلي إلى الموقع الأصلي.
من ناحية أخرى ، تفترض هذه الوحدة أنه سيتم استخدام نتائجها مع نوع آخر من الموارد القادر على التعامل مع بعض الملفات التي يتم تقديمها في الذاكرة والملفات الأخرى التي يتم قراءتها مباشرة من القرص. هذا صحيح بالنسبة لـ aws_s3_bucket_object ، ولكن ليس صحيحًا لجميع أنواع الموارد التي قد تعمل مع الملفات التعسفية.