كيفية تنظيم مشروع Terraform

مقدمة

التكوين السليم لمشاريع Terraform وفقاً للحالات المستخدمة والتعقيد المتوقع أساسي لضمان الصلابة والتوسعة في التجارب اليومية. أساسي أن تتبع منهجية تنظيم الملفات البرمجية بشكل صحيح لضمان أن المشروع يبقى قابلاً للتوسع خلال التنفيذ وقابلاً للاستخدام من قبلك وفريقك.

في هذا الدرس التعليمي، ستتعلم المقاطعة للمشاريع الخاصة بTerraform وفقاً للغرض العام والتعقيد. ومن ثم، ستقوم بإنشاء مشروع بهيكل بسيط باستخدام أكثر الميزات الشائعة من Terraform: المتغيرات، المحليات، المصادر البيانات، والمزadores. وفي النهاية، سيتم تنفيذ سيرفر للخوادم العاملة Ubuntu 20.04 (قطعة) على DigitalOcean، وتثبيت مرور للخوادم الويب Apache، وتوجيه أحدى أنواع من الأحوال إلى المرور.

الأحتياجات السابقة

ملاحظة: قد تم اختبار هذا الدرس بشكل خاص مع Terraform 1.0.2 فقط.

فهم بنية مشروع Terraform

في هذا المقطع ستتعلم ما يعتبره ترافارم مشروعًا، كيف يمكنك تشكيل شيء من البنية التحتية بواسطة الشفرة، وفي أي وقت يجب اختيار منهج معين. ستتعلم أيضًا عن أراءة ترافارم، ما يفعله، وكيف تقوم ترافارم بتخزين الحالة.

أي مورد هو جهة من خدمة السحابة (مثل قطعة DigitalOcean Droplet) المعروفة في ترافارم الشفرة التي تنشأ وفقاً لخصائص معينة وتلك التي تنتج من خلالها. تتكون البنية التحتية من الموارد العديدة والتي تترابع مع بعضها البعض من خلال الاتصالات المتشابكة.

تستخدم ترافارم لغة برمجية خاصة لتعريف البنية التحتية، وهي لغة Hashicorp Configuration Language (HCL). تتخزين الشفرة HCL عادةً في الملفات التي تنتهي بتوسيع قمة tf. مشروع ترافارم هو أي دارة تحتوي على tf ملفات والتي تم تكيفها باستخدام الأمر init، وهو ما يوفر مستودعات ترافارم والحالة المحلية الافتراضية التقدمية.

تلك الحالة هي آلية تمكن ترافارم من إتباع موارد التي تتم توفيرها في السحابة. الحالة تتخزين في الخلفيات (محليًا على القرنبيط أو عن بعدًا على خدمة تخزين الملفات السحابية أو برمجيات إدارة الحالة التقييمية) للتوافر الأفضل والامانة. يمكنك أن تقرأ المزيد عن الخلفيات المختلفة في توثيق ترافارم.

يمكنك أن تمتلك مساحات عمل متعددة في نفس الخلفية المتصلة بنفس التكوينات. هذا يسمح لك بتنفيذ عدة مستويات من الأيركاد منفصلة. يبدأ كل مشروع بمساحة عمل تدعى default — سيتم استخدامها إذا لم يكن لديك تخزين آخر أو تحويل إليه.

الموديولات في Terraform (تشبه المجموعات في لغات البرمجيات الأخرى) هي حاجزات تحميل البرمجيات المتعددة المتخزنة تحويل عدة اعلانات الموارد. يسمح لك بتجميع جزء مشترك من البنية التحتية وإعادة استخدامه من خلال معطيات مختلفة.

يمكن أيضًا أن تشمل مشروع Terraform ملفات برمجيات خارجية للاستخدام مع معطيات البيانات التي تقوم بتجويب الإختراقات الJSON من أوامر البرمجيات الخارجية وتقدمها للاستخدام في الاعلانات المواردية. في هذا التورية، ستقوم بهذا مع 脚本 Python.

بعد أن تعرفت ما تتكون منه مشروع Terraform، دعونا نراقب أساليبين عامتين لتشكيل مشاريع Terraform.

ترتيب بسيط

بنية بسيطة تناسب المشاريع الصغيرة والتجريبية والتي تتمتع بقليل من الموارد بأنواع مختلفة والمتغيرات. وتحتوي على قليل من الملفات الإعدادية عادةً واحد لكل نوع من الموارد (أو مزيد من المساعدات المترابطة مع الرئيسي) ولا تحتوي على مواد خاصة لأن معظم الموارد فريدة ولا يكون هناك ما يكفي ليتم تعميمه وإستخدامه مجددًا. وبعد هذا يتم تخزين معظم البرمجيات في نفس المجلد مع بعضها البعض. وهذه المشاريع تحتوي على قليل من المتغيرات (مثل مفتاح تواصل API للوصول إلى السحابة) وقد تستخدم أدات بيانات تتغيرية وميزات أخرى لـ Terraform وHCL ، وعلى الأقل ليس بشكل بارز.

ولكن على سبيل المثال للبنية الملاحظية لهذه الطريقة ، هذا ما سيبدو مشروع التدريب الذي ستبنيه في هذه الدروسة في النهاية:

.
└── tf/
    ├── versions.tf
    ├── variables.tf
    ├── provider.tf
    ├── droplets.tf
    ├── dns.tf
    ├── data-sources.tf
    └── external/
        └── name-generator.py

ولأن هذا المشروع سيتم تنفيذ مستودع Apache وتعريف سجلات DNS ، فإن تعريفات المتغيرات المشروعية ومزيل الأنظمة Terraform والمستودعات والسجلات الإلكترونية ستتم تخزينها في ملفاتهم الخاصة. سيتم تحديد الأصدارات المطلوبة لـ Terraform ومزيل الأنظمة DigitalOcean في versions.tf ، بينما سيتم تخزين مقال البرمجيات البيانية التي ستنتج إسم للمستودع (وسيتم استخدامه كمصدر بيانات تتغيرية في data-sources.tf) في المجلد external ، لتفصيله عن البرمجيات البيانية الخاصة بـ HCL.

بنية معقدة</diy5

بخلاف الهيكل البسيط، هذا المقارب مناسب للمشاريع الكبيرة والتي تحتوي على ترتيبات فرعية معلومة تحوي متسع من الموديولات بمستويات متنوعة من التعقيد، بجانب البرمجيات العادية. هذه الموديولات قد تعتمد على بعضها البعض. متوفرة بالإشمال بالنظم التنظيمية للإصدارات، يمكن لهذه المشاريع استخدام مساحات العمل بشكل واسع. هذه المقاربة مناسبة للمشاريع الكبيرة التي تدير عدد من التطبيقات وتحويل قدر ما يمكن المحتويات البرمجية من تكرار.

يمكن أيضًا تقديم الحالات المتعددة للتطوير، المرحلة المستقبلية، التأكد الجودة، والبيئة الإنتاجية تحت نفس المشروع في directories مختلفة بواسطة التثبيت على الموديولات المشتركة، مما يبطئ بتكرار البرمجيات ويجعل المشروع المركز للمصدر الأقرب للحقيقة. هذه هي هيكل الملفات لمشروع مثالي مع هيكل معقد أكثر، يحتوي على عدد من التطبيقات التوزيعية، وموديولات Terraform وبيئات السحاب المستهدفة:

.
└── tf/
    ├── modules/
    │   ├── network/
    │   │   ├── main.tf
    │   │   ├── dns.tf
    │   │   ├── outputs.tf
    │   │   └── variables.tf
    │   └── spaces/
    │       ├── main.tf
    │       ├── outputs.tf
    │       └── variables.tf
    └── applications/
        ├── backend-app/
        │   ├── env/
        │   │   ├── dev.tfvars
        │   │   ├── staging.tfvars
        │   │   ├── qa.tfvars
        │   │   └── production.tfvars
        │   └── main.tf
        └── frontend-app/
            ├── env/
            │   ├── dev.tfvars
            │   ├── staging.tfvars
            │   ├── qa.tfvars
            │   └── production.tfvars
            └── main.tf

يتم بحث أوسع في سلسلة كيفية إدارة البيئة التحتية بواسطة Terraform.

لقد عرفتم المشروع المتعلق بTerraform، كيف يمكنك تشكيله بطريقة توافق مع التعقيد المتوقع، ودور المساحات العملية في Terraform. في الخطوات القادمة، ستقومون بإنشاء مشروع بهيكل بسيط سيقوم بتوفير دوبلت مع مزجر Apache وتأسيس سجلات DNS ل dominio خاص بكم. ستبدأون بتمرير مشروعك مع مورد DigitalOcean والمت

خطوة 1 — إعداد مشروعك الأول

في هذه القسم ستقوم بإضافة مزيد من مزودي ترافير DigitalOcean لمشروعك وتعريف المتغيرات الخاصة بالمشروع، وإعلان معالم مزيد للمزود، حتى يتمكن Terraform من تواصل مع حسابك.

بدء بإنشاء مجلد لمشروع ترافير Terraform باستخدام الأمر التالي:

  1. mkdir ~/apache-droplet-terraform

تحويل إلىه:

  1. cd ~/apache-droplet-terraform

لأن هذا المشروع سيتبع المنهج التنظيمي البسيط، ستقوم بتخزين المزيد من مزود، المتغيرات، و تسجيلات الـ Droplet والبيانات الخاصة بالـ DNS في ملفات منفصلة، وفقاً للتكوين الملفي الموجود في القسم السابق. أولاً، ستحتاج إلى إضافة مزيد من مزودي ترافير DigitalOcean لمشروعك كمزود مطلوب.

قم بإنشاء ملف يسمى versions.tf وافتحه للتحرير بتنفيذ:

  1. nano versions.tf

أضف السطور التالية:

~/apache-droplet-terraform/versions.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

في هذا ال terraform تقع تعريف المزودين المطلوبين (DigitalOcean، الإصدار 2.x). عندما يتم إنتهاء هذا، حفظ وغلق الملف.

بعد ذلك، تعريف المتغيرات التي سيتم تعريفها بالمشروع في ملف variables.tf، وبتتبع طريقة تخزين الأنواع المختلفة في ملفات تخزينية:

  1. nano variables.tf

أضف المتغيرات التالية:

~/apache-droplet-terraform/variables.tf
variable "do_token" {}
variable "domain_name" {}

حفظ وغلق الملف.

سيتم حمل قيمة المستخدم الشخصي لـ DigitalOcean في متغير do_token وسيحدد ما يراد تسميته مجالدك الخاص. سيتم تثبيت المجالد الخاص بـ SSH والتي يمكن تحديدها من بصمة SSH، تلقائيًا.

إليك تحديد مثالي للمزود الرقمي الخاص بـ DigitalOcean لهذا المشروع. ستقم بتخزينه في ملف يدعى provider.tf. قم بإنشائه وفتحه للتحرير بتنفيذ:

  1. nano provider.tf

أضف المزود:

~/apache-droplet-terraform/provider.tf
provider "digitalocean" {
  token = var.do_token
}

حفظ وخرج حينما تنتهي. لقد قمت بتعريف المزود digitalocean الذي يتماشى مع المزود المطلوب الذي توصلت إليه مسبقًا في provider.tf، وتعريفت بطولته لقيمة المتغير التي ستتم تقديمها خلال التشغيل الفعال.

في هذه الخطوة قمت بإنشاء مجال لمشروعك، وطلبت من المزود الرقمي الخاص بـ DigitalOcean أن يكون متاحًا، وعرضت متغيرات المشروع، وأنشأت اتصالًا بنسخة من مزود ال DigitalOcean لإستخدام توكيل تعريفي سيتم تقديمه في المرحلة القادمة. الآن سوف تكتب 脚本 سينتج بيانات ديناميكية لتعريفات مشروعك.

الخطوة 2 — إنشاء 脚本 بيانات ديناميكية لـ Python

قبل الاستمرار في تعريف الجسيم التالي (Droplet), سوف تقوم بإنشاء 脚本 Python سيقوم بتوليد أسم الجسيم التالي (Droplet) بشكل ديناميكي و يكلف مصدر بيانات لتحليله. سيتم توليد الأسم من خلال تراكم السطر الثابت (web) مع وقت الجهاز المحلي الحالي والمعروف في النمط العمل القديم للUNIX. قد يكون مفيداً إستخدام خطوط تسمية عندما تنتج متعدد جسيمات (Droplets) وفقاً لخطة تسميات، لتسهيل تمييزهم بسهولة.

سوف تقوم بتخزين هذا البرنامج في ملف يسمى name-generator.py في دايرة تسمى external. أولاً، قم بإنشاء الدايرة بتنفيذ:

  1. mkdir external

توجد الدايرة external في جذور مشروعك وسوف تخزين فيه ملفات غير الـHCL، مثل البرنامج الPython الذي ستكتب.

قم بإنشاء name-generator.py في external وافتحه للتحرير:

  1. nano external/name-generator.py

أضف التعريف التالي:

external/name-generator.py
import json, time

fixed_name = "web"
result = {
  "name": f"{fixed_name}-{int(time.time())}",
}

print(json.dumps(result))

هذا البرنامج Python يقوم باستيراد مواد الjson والtime ويكلف مصدر تسمية القاموس يسمى result وتعطي قيمة مفاتيح الname لسلسلة متقاطعة تتكامل مع fixed_name مع الوقت الUNIX الحالي للجهاز الذي يجري فيه. ثم يتم تحويل result إلى JSON وتخرج من stdout. سيكون نتائج الخروج مختلفة كل مرة تجري تشغيل البرنامج:

Output
{"name": "web-1597747959"}

عندما ينتهي العمل على الملف، أبقه وأغلقه.

ملاحظة: يتطلب المشاريع الهيكلية الكبيرة والمعقدة من التفكير المتعمّد في كيفية إنشاء مصادر البيانات الخارجية واستخدامها، خاصة بالنسبة للقابلية للتنقل ومعالجة الأخطاء. تتوقع Terraform أن يكتب البرنامج المؤكد رسالة خطأ قابلة للقراءة بواسطة stderr ويخرج بوجود خطأ غير صفر، وهو شيء لم يظهر في هذه الخطوة بسبب بساطة المهمة. بالإضافة إلى ذلك، تتوقع أن يكون البرنامج بدون تأثيرات جانبية، لذا يمكن تكراره عدة مرات كما يحتاج.

لمعلومات أكثر حولما تتوقع Terraform، أنظر إلى التوثيق الرسمي المتعلق بالمصادر البياناتية.

حينما يكون الscript جاهزًا، يمكنك تعريف المصدر البياناتي، الذي سيجلب البيانات من الscript. سوف تخزن المصدر البياناتي في ملف يسمى data-sources.tf في جذور مشروعك وفقًا لمنهجية التركيب البسيط.

إنشأه للتحرير بواسطة الأمر:

  1. nano data-sources.tf

أضف التعريف التالي:

~/apache-droplet-terraform/data-sources.tf
data "external" "droplet_name" {
  program = ["python3", "${path.module}/external/name-generator.py"]
}

حفظ وأغلق الملف.

هذا المصدر البياناتي يدعى droplet_name ويقوم بتنفيذ الscript name-generator.py بواسطة Python 3 الذي يقطن في المجلد external الذي أنشأته مؤخرًا. يتم تجزأة مخرجه الخاص به وتوفير البيانات التي يتم تعريفها تحت خصيصها result للاستخدام داخل تعريفات الموارد الأخرى.

بعد إعلان المصدر ال

خطوة 3 — تعريف الجسم السطحي

في هذه الخطوة، ستكتب تعريف المورد السطحي وستقوم بتخزينه في ملف برمجي يخص الجسم السطحي، وفقاً لمقاربة الترميز البسيط. سيأخذ إسمه من مصدر البيانات الديناميكية التي قمت بإنشائه مؤخرًا وسيختلف كل مرة يتم تخزينه.

قم بإنشاء وفتح ملف droplets.tf للتحرير:

  1. nano droplets.tf

أضف التعريف التالي للمورد السطحي المطلوب:

~/apache-droplet-terraform/droplets.tf
data "digitalocean_ssh_key" "ssh_key" {
  name = "your_ssh_key_name"
}

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = data.external.droplet_name.result.name
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.ssh_key.id
  ]
}

أولاً ، قم بإعداد مورد مفتاح SSH لـ DigitalOcean يدعى ssh_key ، الذي سيجلب مفتاحًا من حسابك باسمه. أوكي تأكد من تجديل هذا البرمجيات باسم مفتاحك الشخصي السي.

بعد ذلك ، قم بإعداد مورد الجسم السطحي يدعى web ، وإسمه الحقيقي في السحابة سيختلف لأنه يطلب من مصدر البيانات الخارجي droplet_name. لتبديل مورد الجسم السطحي بمفتاح SSH في كل مرة يتم تخزينه يتم تقديم معرفي مورد ssh_key إلى ما يلي ssh_keys ، حتى يعلم ما يلي مورد DigitalOcean أي مفتاح يجب تطبيقه.

حتى الآن هذه كل ما تحتاج إلى تكوينه بشأن droplet.tf ، لذا حفظ وغلق الملف حينما تنتهي.

ستكتب الآن تكوينات السجل التي ستدفع إلى جسم السطحي المعروف مؤخرًا.

خطوة 4 — تعريف سجلات DNS

هذه هي الخطوة الأخيرة في العملية ، وهي تقوم بتكوين السجل ال DNS الموجه إلى ال Droplet من قومك.

سوف تقوم بتخزين التكوين ال DNS في ملف يدعى dns.tf ، لأنه نوع من الموارد المنفصل عن الأخرين التي قمت بإنشائها في الخطوات السابقة. قم بإنشائه وافتحه للتعديل:

  1. nano dns.tf

أضف الخطوط التالية:

~/apache-droplet-terraform/dns.tf
resource "digitalocean_record" "www" {
  domain = var.domain_name
  type   = "A"
  name   = "@"
  value  = digitalocean_droplet.web.ipv4_address
}

هذا الكود يدeclare سجل DNS ل DigitalOcean في أسم الموقع الخاص بك (يتم تخزينه بواسطة المتغير) من نوع A. السجل له إسم @ ، وهو وسيلة تجاوز توجه الإسم الموقعي إلى نفسه ورقم ال IP الخاص بال Droplet كقيمة value. يمكنك تجديد قيمة name بشيء آخر ، وسينتج عن ذلك قراءة قطعة فرعية.

عندما تنتهي ، حفظ وغلق الملف.

وبعدما قمت بتكوين ال Droplet ومصدر البيانات المنتجة للأسماء وسجل DNS واحد سوف تتجه إلى تنفيذ المشروع في السحابة.

خطوة 5 — التخطيط وتطبيق الإعدادات

في هذا القسم ستقوم بتأسيس مشروعك الخاص بTerraform وتوزيعه في السحابة وتحقق من أن كل شيء قد تم توفيره بطريقة correct.

وبعدما تم تعريف بالكامل ببنية مشروعك الخاص بTerraform ، فلا يبقى سوى التحقق منه قبل التوزيع. لقد تم تشغيل أمر تلك الأوامر:

  1. terraform init

ستحصل على المخرج التالي:

Output
Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Finding latest version of hashicorp/external... - Installing digitalocean/digitalocean v2.10.1... - Installed digitalocean/digitalocean v2.10.1 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) - Installing hashicorp/external v2.1.0... - Installed hashicorp/external v2.1.0 (signed by HashiCorp) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. 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.

ستتمكن حاليا من توزيع دوبلتك الخاص بك بإسم ديناميكي منتج ومعه مجال شبكي في حسابك الخاص بDigitalOcean.

بدءا بتعريف الإسم الموجود في المجال الشبكي ، وأعادة تواصل الSSH والتواصل الشخصي لمفاتيح الحساب الخاصة بك كمتغيرات البيئة ، لكي لا يتوجب عليك نسخ القيم كل مرة تشغل Terraform. قم بتشغيل الأوامر التالية وتغيير القيم المبرزة:

  1. export DO_PAT="your_do_api_token"
  2. export DO_DOMAIN_NAME="your_domain"

يمكنك إيجاد مفاتيحك الخاصة بالAPI في لوحة مراقبة حسابات DigitalOcean.

قم بتشغيل أمر plan مع القيم المتبعة لرؤية ما ستقوم Terraform بعمله لتوزيع مشروعك:

  1. terraform plan -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}"

سيكون المخرج يشابه التالي:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web سيتم إنشاؤه + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1625908814" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + ssh_keys = [ + "...", ] + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } # digitalocean_record.www سيتم إنشاؤه + resource "digitalocean_record" "www" { + domain = "your_domain'" + fqdn = (known after apply) + id = (known after apply) + name = "@" + ttl = (known after apply) + type = "A" + value = (known after apply) } Plan: 2 to add, 0 to change, 0 to destroy. ...

ستشاهد أخطوات ببطء بعضها بتوقع أن تكون موجودة بعد الإنشاء وهذا بالضبط ما يجب أن يحدث ، لذلك يمكنك تطبيق التكوين:

  1. terraform apply -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}"

سيكون المخرج كما من قبل ، ما عدا أن هذه المرة سيطرح عليك السؤال:

Output
Plan: 2 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: `yes`

أدخل yes وسيتم توفير دوبلتكك والسجل التليفزيوني:

Output
digitalocean_droplet.web: Creating... ... digitalocean_droplet.web: Creation complete after 33s [id=204432105] digitalocean_record.www: Creating... digitalocean_record.www: Creation complete after 1s [id=110657456] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

ترافورم قد تسجيل الموارد المتوفرة الآن في حالته. للتأكد من أن السجلات الDNS والDroplet قد تم ربطهما بنجاح، يمكنك استخراج عنصر الIP للDroplet من الحالة المحلية والبحث عن ما إذا كان يتطابق مع السجلات الDNS العامة ل dominio خاص بك. قم بتشغيل الأمر التالي لحصول على عنصر الIP:

  1. terraform show | grep "ipv4"

ستحصل على عنصر IP للDroplet الخاص بك:

Output
ipv4_address = "your_Droplet_IP" ...

يمكنك البحث عن السجلات العامة A بتشغيل:

  1. nslookup -type=a your_domain | grep "Address" | tail -1

ستظهر الناتج بعنصر IP الذي يتم إشارته إلى السجل العام:

Output
Address: your_Droplet_IP

هم نفسهم، كما يجب أن يكونوا، مما يعني أن الDroplet وسجل DNS تم توفيرهما بنجاح.

للتأكد من أن التغييرات في الخطوة القادمة ستنفذ قم بتدمير الموارد المتوفرة بتشغيل:

  1. terraform destroy -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}"

عندما يتم المعاينة ، أدخل yes للمتابعة.

في هذه الخطوة قمت بإنشاء بنيتك وتطبيقه على حسابك الخاص ب DigitalOcean. سوف تغيره الآن لتتمكن من تثبيت Apache متصل بالإنترنت على الDroplet المتوفر بواسطة Terraform provisioners.

الخطوة 6 — تشغيل الشيء بواسطة الممرضين

حالياً سوف تقوم بتأسيس تثبيت Apache متصل بالإنترنت على دوبلتك المتوفر الآن باستخدام ممرض التنفيذ التعليمي للقيام بأوامر شخصية.

تماماً تستطيع استخدام موردات ترافيسبورد لتنفيذ أفعال تحديدية على الموارد البعيدة المنشئة (مورد التنفيذ البعيد remote-exec) أو الجهاز المحلي الذي يتم تنفيذ البرمجيات عليه (باستخدام المورد local-exec). إذا فشل مورد تنفيذ، سيتم تعريف النقطة ك tainted في الحالة الحالية، وهذا يعني أنها ستُحذف وستُعيد إنشاؤها خلال الترافيسبورد القادم.

للاتصال بالقطعة المستهدفة المتوفرة، تحتاج ترافيسبورد إلى مفتاح الـSSH الخاص بها، الذي يتم تأسيسه على القطعة. أفضل طريقة لتمرير موقع المفتاح الخاص هي عن طريق المتغيرات، لذا افتح variables.tf للتعديل:

  1. nano variables.tf

أضف السطر الملون:

~/apache-droplet-terraform/variables.tf
variable "do_token" {}
variable "domain_name" {}
variable "private_key" {}

لقد أضفت الآن متغير جديد يُدعى private_key لمشروعك. حفظ وغلق الملف.

من ثم، سوف تضيف البيانات الاتصالية والمورد البعيد التعريفي ل配置اتك القطعية. افتح droplets.tf للتعديل بتنفيذ الأمر:

  1. nano droplets.tf

وسيتم توسيع البرمجيات الموجودة بالسطور الملونة:

~/apache-droplet-terraform/droplets.tf
data "digitalocean_ssh_key" "ssh_key" {
  name = "your_ssh_key_name"
}

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = data.external.droplet_name.result.name
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.ssh_key.id
  ]

  connection {
    host        = self.ipv4_address
    user        = "root"
    type        = "ssh"
    private_key = file(var.private_key)
    timeout     = "2m"
  }

  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # Install Apache
      "apt update",
      "apt -y install apache2"
    ]
  }
}

يحدد القطعة connection كيفية تواصل ترافيسبورد مع القطعة المستهدفة. ويحتوي القطعة provisioner على توالي أوامر، خلال الماركات الفائزة inline، التي ستنفذ بعد التوعية. وهذا يعني تحديث قاعدة البيانات الخاصة بمودمر البرمجيات وتثبيت Apache. حفظ وغلق عندما تنتهي.

يمكنك أيضًا إنشاء متغير بيئة temporal لمسار المفت

  1. export DO_PRIVATE_KEY="private_key_location"

ملاحظة: يتوجب وضع المفاتيح الخاصة وأي ملف آخر تود تحميله من داخل Terraform ضمن المشروع. يمكنك مشاهدة درس التوجيه كيفية تكوين التوافر المولد بواسطة مفتاح SSH على سيرفر لينكس لمعلومات أكثر حول إعداد مفتاح SSH على Ubuntu 20.04 أو أخرى توزيعات.

حاول تطبيق الإعدادات مرة أخرى:

  1. terraform apply -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

أدخل yes عند التقا prompt. سوف تحصل على ما يشابه الخريطة السابقة، ومواءمة بما يزيد من الخريطة الطويلة من متوفر الموارد البعيدة عن المورد remote-exec:

Output
digitalocean_droplet.web: Creating... digitalocean_droplet.web: Still creating... [10s elapsed] digitalocean_droplet.web: Still creating... [20s elapsed] digitalocean_droplet.web: Still creating... [30s elapsed] digitalocean_droplet.web: Provisioning with 'remote-exec'... digitalocean_droplet.web (remote-exec): Connecting to remote host via SSH... digitalocean_droplet.web (remote-exec): Host: ... digitalocean_droplet.web (remote-exec): User: root digitalocean_droplet.web (remote-exec): Password: false digitalocean_droplet.web (remote-exec): Private key: true digitalocean_droplet.web (remote-exec): Certificate: false digitalocean_droplet.web (remote-exec): SSH Agent: false digitalocean_droplet.web (remote-exec): Checking Host Key: false digitalocean_droplet.web (remote-exec): Connected! ... digitalocean_droplet.web: Creation complete after 1m5s [id=204442200] digitalocean_record.www: Creating... digitalocean_record.www: Creation complete after 1s [id=110666268] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

يمكنك الآن التنقل إلى مجالك الرئيسي في متصفح الويب. سوف ترون صفحة مرحبا بApache الافتراضي.

هذا يعني أن Apache تم تثبيته بنجاح، وأن Terraform قام بتوفير كل شيء بالطريقة الصحيحة.

لتدمير الموارد المتوفرة، قم بتشغيل الأمر التالي وأدخل yes عند التقا prompt:

  1. terraform destroy -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

لقد أنجزت الآن مشروع صغير لTerraform مع بنية بسيطة تنتشر موقع الويب Apache في قمة Droplet وتوفير سجلات DNS للمجال الرئيسي المرغوب فيه.

الخلاصة

قد تعلمت عن مقاربتين عامتين لتشكيل مشاريعكم في Terraform وفقاً للتعقيد بالذي تلتزم به. بعد التوجه البسيط للتشكيل واستخدام الموصل remote-exec لتنفيذ الأوامر، تم تخزين دوبليو يشتغل بالApache مع سجلات الDNS لدومينك الخاص.

وللمرجع هذه هي البنية التي أنشأتها في هذا التوريتال:

.
└── tf/
    ├── versions.tf
    ├── variables.tf
    ├── provider.tf
    ├── droplets.tf
    ├── dns.tf
    ├── data-sources.tf
    └── external/
        └── name-generator.py

توفر مواردكم التي قد تعريفتمها (دوبليو الخاص بكم، سجل الDNS ومصدر البيانات التي تتغير ومزود الDigitalOcean والمتغيرات) في ملفات منفصلة كل واحد في خصوصه وفقاً للتشكيل البسيط الذي توصد في القسم الأول من هذا التوريتال.

لمعلومات أكثر حول موارد Terraform وما يتضمنه أحداثها، أنظر إلى التوثيق الرسمي.

هذا التوريتال جزء من السلسلة كيفية إدارة البنية بواسطة Terraform. السلسلة تغطي عددًا من المواضيع في Terraform من تثبيت Terraform لأول مرة إلى إدارة المشاريع المعقدة.

Source:
https://www.digitalocean.com/community/tutorials/how-to-structure-a-terraform-project