اختار المؤلف صندوق البرمجيات الحرة ومفتوحة المصدر لتلقي تبرع كجزء من برنامج الكتابة من أجل التبرعات.
المقدمة
تسمح وحدات Terraform بتجميع الموارد المتميزة في البنية التحتية الخاصة بك في مورد مفترض واحد. يمكنك إعادة استخدامها لاحقًا مع التخصيصات الممكنة دون تكرار تعاريف الموارد في كل مرة تحتاج فيها إليها، مما يعود بالفائدة على المشاريع الكبيرة وذات الهياكل المعقدة. يمكنك تخصيص مثيلات الوحدة باستخدام المتغيرات الداخلية التي تعرفها بالإضافة إلى استخراج المعلومات منها باستخدام المخرجات. بالإضافة إلى إنشاء وحدات مخصصة خاصة بك، يمكنك أيضًا استخدام الوحدات المُعدة مسبقًا والتي تم نشرها علنًا على سجل Terraform. يمكن للمطورين استخدامها وتخصيصها باستخدام المدخلات مثل الوحدات التي تنشئها، ولكن يتم تخزين كود المصدر الخاص بهم في السحابة واسترجاعه منها.
في هذا البرنامج التعليمي، ستقوم بإنشاء وحدة Terraform ستقوم بإعداد عدة Droplets خلف محمل توازن لضمان التكرار. ستستخدم أيضًا ميزات الحلقة for_each
و count
في لغة تكوين Hashicorp (HCL) لنشر عدة مثيلات مخصصة من الوحدة في نفس الوقت.
المتطلبات
- A DigitalOcean Personal Access Token, which you can create via the DigitalOcean control panel. You can find instructions in the DigitalOcean product document, How to Create a Personal Access Token.
- تركيب Terraform على جهازك المحلي وإعداد مشروع مع موفر DO. أكمل الخطوة 1 و الخطوة 2 من كيفية استخدام Terraform مع DigitalOcean البرنامج التعليمي، وتأكد من تسمية مجلد المشروع
terraform-modules
بدلاً منloadbalance
. خلال الخطوة 2، لا تتضمن المتغيرpvt_key
ومورد مفتاح SSH. - الملم بأنواع بيانات HCL والحلقات. لمزيد من المعلومات، انظر إلى كيفية تحسين المرونة باستخدام متغيرات Terraform والتبعيات والشروط البرنامج التعليمي.
- الملم بمخرجات Terraform واستخدامها. يمكنك متابعة البرنامج التعليمي كيفية إدارة بيانات البنية التحتية مع مخرجات Terraform لتعلم المزيد عنها.
ملاحظة: تم اختبار هذا البرنامج التعليمي بشكل خاص مع Terraform 1.1.3
.
هيكل الوحدة والفوائد
في هذا القسم، ستتعرف على الفوائد التي تقدمها الوحدات، وأين يتم وضعها عادة في المشروع، وكيفية تنظيمها.
تُنشأ الوحدات المخصصة في Terraform لتجميع المكونات المتصلة التي يتم استخدامها ونشرها معًا بشكل متكرر في مشاريع أكبر. إنها مستقلة ذاتيا، حيث تقوم بتجميع الوسائط والمتغيرات وموفري الخدمة التي تحتاج إليها فقط.
تُخزن الوحدات عادة في مجلد مركزي عند جذر المشروع، كل منها في مجلد فرعي خاص به أسفل المجلد الرئيسي. ومن أجل الحفاظ على فصل نظيف بين الوحدات، يُوصى دائمًا بتصميمها لتكون لها هدف واحد والتأكد من عدم احتوائها على وحدات فرعية.
من المفيد إنشاء وحدات من مخططات الموارد الخاصة بك عندما تجد نفسك تكرارها مع تخصيصات نادرة. تكوين مورد واحد كوحدة قد يكون زائدًا ويزيل تدريجيًا بساطة الهندسة المعمارية العامة.
بالنسبة لمشاريع التطوير الصغيرة والاختبارية، ليس من الضروري دمج الوحدات لأنها لا تجلب تحسينات كبيرة في تلك الحالات. باستخدام قدرتها على التخصيص، تعتبر الوحدات عنصر بناء المشاريع المعقدة. يستخدم المطورون الوحدات للمشاريع الكبيرة بسبب المزايا الكبيرة في تجنب تكرار الكود. كما توفر الوحدات أيضًا الفائدة بأن تحتاج التعريفات إلى تعديل في مكان واحد فقط، والذي سينتشر بعد ذلك في بقية البنية التحتية.
ثم ستقوم بتعريف واستخدام وتخصيص الوحدات في مشاريع Terraform الخاصة بك.
إنشاء وحدة
في هذا القسم، ستقوم بتعريف عدة Droplets وموزع حمولة كموارد Terraform وتجميعها في وحدة. ستقوم أيضًا بجعل الوحدة الناتجة قابلة للتخصيص باستخدام مدخلات الوحدة.
سوف تقوم بتخزين الوحدة في دليل يسمى droplet-lb
، تحت دليل يُدعى modules
. بافتراض أنك في دليل terraform-modules
الذي قمت بإنشائه كجزء من المتطلبات الأولية، قم بإنشاء كلاهما في وقت واحد عن طريق تشغيل:
تُوجه السمة -p
mkdir
لإنشاء جميع الدلائل في المسار المقدم.
انتقل إليه:
كما تم الإشارة إليه في القسم السابق، تحتوي الوحدات على الموارد والمتغيرات التي تستخدمها. ابتداءً من Terraform 0.13
، يجب أيضًا أن تتضمن تعريفات للمزودين الذين يستخدمونهم. لا تتطلب الوحدات أي تكوين خاص للملاحظة بأن الكود يمثل وحدة، حيث يعتبر Terraform أي دليل يحتوي على كود HCL كوحدة، حتى الدليل الجذري للمشروع.
يتم عرض المتغيرات المعرفة في وحدة على أنها مدخلاتها ويمكن استخدامها في تعاريف الموارد لتخصيصها. ستحتوي الوحدة التي ستقوم بإنشائها على مدخلين: عدد Droplets لإنشائها واسم مجموعتها. قم بإنشاء ملف وافتحه للتحرير بعنوان variables.tf
حيث ستقوم بتخزين المتغيرات:
أضف السطور التالية:
احفظ وأغلق الملف.
ستخزن تعريف الـ Droplet في ملف يسمى droplets.tf
. قم بإنشائه وافتحه للتحرير:
أضف السطور التالية:
بالنسبة لمعلمة count
، التي تحدد عدد الحالات من المورد التي يجب إنشاؤها، يمكنك تمرير المتغير droplet_count
. سيتم تحديد قيمته عند استدعاء الوحدة من رمز المشروع الرئيسي. سيكون اسم كل Droplet متميزًا، وذلك من خلال إضافة فهرس الـ Droplet الحالي إلى اسم المجموعة المقدمة. سيتم نشر Droplets في منطقة fra1
وستعمل بنظام Ubuntu 20.04.
عند الانتهاء، احفظ وأغلق الملف.
بعد تعريف الـ Droplets الآن، يمكنك المضي قدمًا في إنشاء موزع الحمل. ستخزن تعريف المورد في ملف يسمى lb.tf
. قم بإنشائه وافتحه للتحرير عن طريق التشغيل:
أضف تعريف المورد:
تعريف موزع الحمل بإسم المجموعة في اسمه من أجل تمييزه. ستقوم بنشره في منطقة fra1
بجانب الـ Droplets. القسمان التاليان يحددان الأهداف والمنافذ والبروتوكولات المراقبة.
الكود المشار إليه droplet_ids
يأخذ في قطعة الهوية للدروبلتس، التي يجب إدارتها بواسطة محمل التوازن. نظرًا لوجود عدة دروبلتس، وعدم معرفة عددها مسبقًا، يتم استخدام حلقة for
لتصفح مجموعة الدروبلتس (digitalocean_droplet.droplets
) وأخذ هوياتها. يتم وضع الحلقة for
داخل قوسين ([]
) بحيث يكون المجموع الناتج قائمة.
احفظ وأغلق الملف.
لقد قمت الآن بتعريف الدروبلت، ومحمل التوازن، والمتغيرات لوحدتك. ستحتاج إلى تعريف متطلبات المزود، محددًا الـ Providers التي تستخدمها الوحدة، بما في ذلك إصدارها وموقعها. منذ Terraform 0.13
، يجب على الوحدات تحديد مصادر Providers الغير مُدارة بواسطة Hashicorp التي تستخدمها؛ هذا لأنها لا تورث من المشروع الأصلي.
ستقوم بتخزين متطلبات المزود في ملف يحمل اسم provider.tf
. أنشئه للتعديل عليه عن طريق تشغيل:
أضف السطور التالية لطلب متطلبات محمل التوازن الرقمي:
احفظ وأغلق الملف عند الانتهاء. وحدة droplet-lb
الآن تتطلب محمل التوازن الرقمي.
الوحدات تدعم أيضًا المخرجات، التي يمكنك استخدامها لاستخراج المعلومات الداخلية حول حالة مواردها. ستقوم بتحديد مخرج يعرض عنوان IP لمحمل التوازن، وتخزينه في ملف يحمل اسم outputs.tf
. أنشئه للتعديل:
أضف التعريف التالي:
هذه المخرج يسترد عنوان IP لمحمل التوازن. احفظ وأغلق الملف.
تم الانتهاء من تطوير وحدة droplet-lb
وهي الآن جاهزة للنشر. ستقوم باستدعائها من الكود الرئيسي، الذي ستخزنه في جذر المشروع. أولاً، قم بالانتقال إليه عبر الانتقال لأعلى في دليل الملفات مرتين:
ثم، قم بإنشاء ملف باسم main.tf
وفتحه للتحرير، والذي ستستخدم فيه الوحدة:
أضف السطور التالية:
في هذه الإعلان، تقوم باستدعاء وحدة droplet-lb
الموجودة في الدليل المحدد كمصدر. ثم تقوم بتهيئة المدخلات التي تقدمها، droplet_count
و group_name
، والتي تم تعيينها إلى group1
حتى تتمكن لاحقًا من التمييز بين الحالات.
نظرًا لأن مخرج تبويب التحميل محدد في وحدة، فلن يتم عرضه تلقائيًا عند تطبيق المشروع. الحل لهذا هو إنشاء مخرج آخر لاسترجاع قيمته (loadbalancer_ip
).
احفظ وأغلق الملف عند الانتهاء.
قم بتهيئة الوحدة عن طريق تشغيل:
سيكون الإخراج على النحو التالي:
OutputInitializing modules...
- groups in modules/droplet-lb
Initializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.19.0...
- Installed digitalocean/digitalocean v2.19.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8)
...
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
يمكنك تجربة تخطيط المشروع لمعرفة الإجراءات التي ستتخذها Terraform عند تشغيلها عن طريق تشغيل:
سيكون الإخراج مشابهًا لهذا:
توضح هذه النتيجة أن Terraform ستقوم بإنشاء ثلاثة Droplets، تحت اسماء group1-0
، group1-1
، و group1-2
، وستقوم أيضًا بإنشاء توازن حمل يسمى group1-lb
، الذي سيدير حركة المرور إلى ومن الـ Droplets الثلاثة.
يمكنك تطبيق المشروع على السحابة عن طريق تشغيل:
أدخل نعم
عندما يُطلب منك. ستظهر النتيجة جميع الإجراءات وسيتم أيضًا عرض عنوان IP للتوازن حمل:
لقد قمت بإنشاء وحدة تحتوي على عدد قابل للتخصيص من Droplets وتوازن حمل سيتم تكوينه تلقائيًا لإدارة حركة المرور الصادرة والواردة.
إعادة تسمية الموارد المنشأة
في القسم السابق، قمت بنشر الوحدة التي قمت بتعريفها وسميتها groups
. إذا أردت في أي وقت تغيير اسمها، فببساطة تغيير اسم الوحدة لن يؤدي إلى النتائج المتوقعة. إعادة تسمية النداء ستجبر Terraform على تدمير الموارد وإعادة إنشائها، مما يسبب فترات تعطيل مفرطة.
على سبيل المثال، افتح main.tf
للتحرير عبر تشغيل:
قم بإعادة تسمية الوحدة groups
إلى groups_renamed
، كما هو موضح:
احفظ وأغلق الملف. ثم، قم بتهيئة المشروع مرة أخرى:
يمكنك الآن تخطيط المشروع:
سيكون المخرجات طويلة، ولكن ستبدو مشابهة لهذا:
Output...
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
- destroy
Terraform will perform the following actions:
# module.groups.digitalocean_droplet.droplets[0] سيتم تدميره
...
# module.groups_renamed.digitalocean_droplet.droplets[0] سيتم إنشاؤه
...
سيطلب منك Terraform تدمير الحالات الحالية وإنشاء حالات جديدة. هذا مدمر وغير ضروري، وقد يؤدي إلى فترات تعطيل غير مرغوب فيها.
بدلاً من ذلك، باستخدام كتلة moved
، يمكنك توجيه Terraform لنقل الموارد القديمة تحت الاسم الجديد. افتح main.tf
للتحرير وأضف الأسطر التالية إلى نهاية الملف:
عند الانتهاء، قم بحفظ وإغلاق الملف.
يمكنك الآن تخطيط المشروع:
عندما تخطط مع وجود كتلة moved
في main.tf
، يرغب Terraform في نقل الموارد بدلاً من إعادة إنشائها:
OutputTerraform will perform the following actions:
# تم نقل module.groups.digitalocean_droplet.droplets[0] إلى module.groups_renamed.digitalocean_droplet.droplets[0]
...
# تم نقل module.groups.digitalocean_droplet.droplets[1] إلى module.groups_renamed.digitalocean_droplet.droplets[1]
...
يؤدي نقل الموارد إلى تغيير موقعها في حالة Terraform، مما يعني أن الموارد السحابية الفعلية لن تتم تعديلها أو تدميرها أو إعادة إنشائها.
نظرًا لأنك ستقوم بتعديل التكوين بشكل كبير في الخطوة التالية، فقم بتدمير الموارد التي تم نشرها عن طريق تشغيل:
أدخل yes
عند الطلب. سينتهي الإخراج في:
Output...
Destroy complete! Resources: 4 destroyed.
في هذا القسم، قمت بتغيير أسماء الموارد في مشروع Terraform الخاص بك دون تدميرها في العملية. الآن، ستقوم بنشر عدة مثيلات من وحدة من نفس الكود باستخدام for_each
و count
.
نشر مثيلات متعددة للوحدة
في هذا القسم، ستستخدم count
و for_each
لنشر وحدة droplet-lb
عدة مرات مع التخصيصات.
استخدام count
طريقة واحدة لنشر عدة حالات من نفس الوحدة دفعة واحدة هي تمرير كم عبر المعلمة count
، التي تكون متاحة تلقائيًا لكل وحدة. افتح main.tf
للتحرير:
قم بتعديله ليبدو مثل هذا، وقم بإزالة تعريف الإخراج الحالي والكتلة moved
:
من خلال تعيين count
إلى 3
، فإنك توجه Terraform لنشر الوحدة ثلاث مرات، كل مرة باسم مجموعة مختلف. عند الانتهاء، احفظ وأغلق الملف.
قم بتخطيط النشر عن طريق تشغيل:
سيكون الإخراج طويلاً، وسيبدو مثل هذا:
تفاصيل Terraform في الإخراج التي ستحتوي كل من الوحدات الثلاث على ثلاثة Droplets وموزع حمل مرتبط بها.
باستخدام for_each
يمكنك استخدام for_each
للوحدات عندما تحتاج إلى تخصيص أكثر تعقيدًا للمثيل، أو عندما يعتمد عدد المثيلات على بيانات طرف ثالث (غالبًا ما تكون عبارة عن خرائط) لا يُعرف أثناء كتابة الكود.
الآن ستقوم بتعريف خريطة تقوم بإقران أسماء المجموعات بعدد Droplet ونشر مثيلات من droplet-lb
وفقًا لذلك. افتح main.tf
للتحرير عبر تشغيل:
قم بتعديل الملف ليبدو مثل هذا:
أولاً، قم بتعريف خريطة تسمى group_counts
تحتوي على عدد Droplets لكل مجموعة معينة. ثم، قم باستدعاء الوحدة droplet-lb
، ولكن حدد أن حلقة for_each
يجب أن تعمل على var.group_counts
، الخريطة التي قمت بتعريفها مباشرة قبل ذلك. droplet_count
يأخذ each.value
، قيمة الزوج الحالي، وهو عدد Droplets للمجموعة الحالية. group_name
يتلقى اسم المجموعة.
احفظ وأغلق الملف عند الانتهاء.
حاول تطبيق التكوين عبر تشغيل:
سيتضمن الإخراج تفاصيل الإجراءات التي ستقوم Terraform باتخاذها لإنشاء المجموعتين مع Droplets وموزعات الحمل الخاصة بهما:
في هذه الخطوة، استخدمت count
و for_each
لنشر مثيلات مخصصة متعددة لنفس الوحدة من نفس التعريف الأساسي للكود.
الاستنتاج
في هذا البرنامج التعليمي، قمت بإنشاء ونشر وحدات Terraform. استخدمت الوحدات لتجميع الموارد المرتبطة منطقيًا معًا وتخصيصها من أجل نشر مثيلات مختلفة متعددة من تعريف الكود المركزي. كما استخدمت المخرجات لعرض سمات الموارد الموجودة في الوحدة.
إذا كنت ترغب في معرفة المزيد عن Terraform، تفضل بزيارة سلسلةنا كيفية إدارة البنية التحتية باستخدام Terraform.
Source:
https://www.digitalocean.com/community/tutorials/how-to-build-a-custom-terraform-module