كيفية إطلاق بيئات متعددة في مشروع Terraform الخاص بك بدون تكرار الكود

اختار المؤلف المنحة الصندوق المجاني للمصدر المفتوح للحصول على تبرع كجزء من برنامج كتابة للتبرعات.

مقدمة

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

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

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

الأحداث السابقة

لإكمال هذا التوريتال، ستحتاج إلى:

  • توكيل شخصي لـ DigitalOcean يمكن إنشاؤه عبر لوحة التحكم لـ DigitalOcean. يمكنك العثور على تعليمات من الوثائق التجارية لـ DigitalOcean في كيفية إنشاء توكيل شخصي.
  • تنصيب Terraform على جهازك المحلي ومشروع مكون بمعالج الـ DO. قم بإكمال خطوة 1 و خطوة 2 من كيفية استخدام Terraform مع DigitalOcean وأنت بحاجة إلى تسمية مجلد المشروع terraform-advanced بدلاً من loadbalance. أثناء خطوة 2 لا تضم معاملة pvt_key وموارد المفاتيح SSH.

ملاحظة: تم اختبار هذا التوريتال بتعامل مع Terraform 1.0.2 بشكل خاص.

توزيع عدة مثاليات للبنية التحتية باستخدام الأساسات

تستخدم عدة أساسات مفيدة عندما ترغب في توزيع أو تجربة نسخة معدّلة من بنيتك الرئيسية دون إنشاء مشروع منفصل وإعادة تأسيس مفاتيح التحقق. بمجرد أن تطورت وتم اختبار خدمة باستخدام الوضع المنفصل، يمكنك أن تدمج البرمجيات الجديدة في الأساسة الرئيسية وربما تمحوء الوضع الإضافي. عندما تقوم بتشغيل مشروع Terraform لأي نوع من الخلفية، تخلق Terraform أساسة تُدعى default. إنها دائمًا موجودة ولا يمكن مسحها.

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

لأن المساحات العملية لا تتبع الكود الفعلي، يجب عليك إدارة فصل الكود بين مساحات عمل متعددة عند مستوى سيطرة الإصدار (VCS) عن طريق مطابقتها لتنويعات البنية التحتية الخاصة بها. كيفية تحقيق ذلك تعتمد على أداة VCS نفسها؛ على سبيل المثال، في فروع Git ستكون مفردة مناسبة. لجعل إدارة الكود للبيئات المتعددة أسهل، يمكنك تقسيمها إلى وحدات قابلة لإعادة الاستخدام، حتى تتجنب تكرار الكود المشابه لكل بيئة.

نشر الموارد في المساحات العملية

ستقوم الآن بإنشاء مشروع ينشر دروبلت، وستطبقه من مساحات عمل متعددة.

ستخزن تعريف الدروبلت في ملف يُدعى droplets.tf.

بفرض أنك في الدليل terraform-advanced، قم بإنشائه وفتحه للتحرير عن طريق تشغيل:

  1. nano droplets.tf

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

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-18-04-x64"
  name   = "web-${terraform.workspace}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

هذا التعريف سيخلق دروبلت يعمل على Ubuntu 18.04 مع نواة CPU واحدة و1 جيجابايت من الذاكرة في المنطقة fra1. سيحتوي الاسم على اسم المساحة العملية الحالية التي يتم نشره منها. عند الانتهاء، أحفظ الملف وأغلقه.

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

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

سيبدو الناتج مماثلًا لهذا:

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-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-default" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

أدخل yes عندما تلتفت لتنفيذ الدوبلت في المساحة الجديدة default.

سيكون إسم الدوبلت web-default, لأن المساحة التي تبدأ بها تدعى default. يمكنك قائمة بالمساحات للتأكد من أنها وحيدة:

  1. terraform workspace list

سيبدو الناتج مماثلًا لهذا:

Output
* default

النجمة (*) تعني أنك تفتقر إلى تلك المساحة الآن.

قم بإنشاء وتحويل إلى مساحة جديدة تدعى testing, والتي ستستخدم لتنفيذ دوبلت مختلف, بتنفيذ workspace new:

  1. terraform workspace new testing

سيبدو الناتج مماثلًا لهذا:

Output
Created and switched to workspace "testing"! You're now on a new, empty workspace. Workspaces isolate their state, so if you run "terraform plan" Terraform will not see any existing state for this configuration.

تخطط لتنفيذ الدوبلت مرة أخرى بتنفيذ:

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

سيكون الناتج مماثلًا للتنفيذ السابق:

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-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-testing" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

لاحظ أن ترافير تخطط لتنفيذ دوبلت يدعى web-testing, والتي قام بتسميته بشكل مختلف عن web-default. ذلك لأن المساحتين default وtesting لهما وضع منفصل ولا يعرفان بعضهما البعض بمواردهم—حتى وإن أتوا من نفس البرمجيات.

للتأكد من أنك في المساحة testing, استخرج إسم المساحة الحالية التي فيها بواسطة workspace show:

  1. terraform workspace show

سيكون الناتج أسم المساحة الحالية:

Output
testing

لحذف مساحة العمل، يجب أولاً أن تدمر جميع الموارد المتوفرة فيها. ومن ثم، إذا كانت فعالة، يجب عليك تحويل الى مساحة أخرى باستخدام `workspace select`. ولأن المساحة `testing` هنا فارغة، يمكنك التحويل إلى `default` بشكل مباشر:

  1. terraform workspace select default

سوف تحصل على إظهار تأكيد Terraform للتحويل:

Output
Switched to workspace "default".

يمكنك من ثم حذفها بتشغيل `workspace delete`:

  1. terraform workspace delete testing

سيقوم Terraform بالحذف:

Output
Deleted workspace "testing"!

يمكنك تدمير درابة التي قمت بتنفيذها في المساحة `default` بتشغيل:

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

أدخل `yes` عندما يتم طرح السؤال لإنهائه.

في هذا المجال عملت في مساحات عدة ل Terraform. وفي المجال القادم سوف تتخذ موارد لا تتخلص منها.

توفير موارد لا تتخلص منها

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

ولأنك قد تنتهي بتدمير هذه الموارد أو أن يتطلب موارد متعددة تخزين بياناتها، فهو أفضل تخزينها في جهة من الكيانات، مثل الأحجام الرقمية لـ DigitalOcean.

توفر الأجسام مساحة تخزين إضافية. يمكن وصلها إلى الدرابلتس (الخوادم), ولكنها منفصلة عنها. في هذه الخطوة ستحدد الأجسام وستربطها بدرابلت في `droplets.tf`.

افتحه للتحرير:

  1. nano droplets.tf

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

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-18-04-x64"
  name   = "web-${terraform.workspace}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

resource "digitalocean_volume" "volume" {
  region                  = "fra1"
  name                    = "new-volume"
  size                    = 10
  initial_filesystem_type = "ext4"
  description             = "New Volume for Droplet"
}

resource "digitalocean_volume_attachment" "volume_attachment" {
  droplet_id = digitalocean_droplet.web.id
  volume_id  = digitalocean_volume.volume.id
}

في هذه المرحلة تحددت موردين جديدين، الأجسام نفسها والتوصيل للأجسام. الأجسام ستكون 10 جيغا بتنسيق `ext4`، وسيدعى `new-volume`، وسيوجد في نفس المنطقة التي توجد درابلتك. لأن الأجسام والدرابلت كأنهما أشياء منفصلة، سيتوجب عليك تعريف عنصر توصيل للأجسام للربط بينهما. `volume_attachment` يأخذ معرفي الدرابلت والأجسام ويوجه السحابة الرقمية المختلفة لإجل جعل الأجسام متاحة للدرابلت كجهاز قراءة/كتابة.

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

خطط لهذه الconfiguration بتشغيل:

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

ستتخذ تلك الأعمال التي تخطط لترافيرم ستكون التالية:

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-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-default" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } # digitalocean_volume.volume ستنشأ + resource "digitalocean_volume" "volume" { + description = "New Volume for Droplet" + droplet_ids = (known after apply) + filesystem_label = (known after apply) + filesystem_type = (known after apply) + id = (known after apply) + initial_filesystem_type = "ext4" + name = "new-volume" + region = "fra1" + size = 10 + urn = (known after apply) } # digitalocean_volume_attachment.volume_attachment ستنشأ + resource "digitalocean_volume_attachment" "volume_attachment" { + droplet_id = (known after apply) + id = (known after apply) + volume_id = (known after apply) } Plan: 3 to add, 0 to change, 0 to destroy. ...

ستظهر التفاصيل الخارجية أن تنشأ درابلت وأجسام وتوصيل للأجسام الذي يربط الأجسام بالدرابلت.

لقد تعريفت الأجسام (مورد اﻹحساس) وربطتها بالدرابلت الآن. في القسم المقبل، ستنظر في الموديلات التي تم بناءها بالفور في Terraform التي يمكنك دمجها في مشروعك.

تعريف المودولات المصنعة مسبقاً

بالإضافة إلى تخليق مودولاتك الخاصة لمشاريعك، يمكنك أيضًا استخدام المودولات المسبقاً مصنوعة والموردين الأخرين من مجموعة الموردين العامة في قاعدة المودولات التيررافم.

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

سوف تضيف الآن مودول مفتاح SSH DigitalOcean إلى مشروعك. سوف تتخزين البرمجيات بعيدًا عن التعريفات الحالية في ملف يطلق عليه ssh-key.tf. قم بإنشائه وفتحه للتحرير بتنفيذ:

  1. nano ssh-key.tf

أضف الخطوات 以下:

module "ssh-key" {
  source         = "clouddrove/ssh-key/digitalocean"
  key_path       = "~/.ssh/id_rsa.pub"
  key_name       = "new-ssh-key"
  enable_ssh_key = true
}

هذا الشيء يحدد مثالا للموديل clouddrove/droplet/digitalocean من ال注册表 ويضع بعض المادة التي يقدمها. يجب أن تضيف مفتاح SSH عام لحسابك بقراءةه من ~/.ssh/id_rsa.pub.

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

قبل أن تخطط لهذا الكود، يجب أن تحمل هذا الموديل المرشد بتشغيل:

  1. terraform init

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

Output
Initializing modules... Downloading clouddrove/ssh-key/digitalocean 0.13.0 for ssh-key... - ssh-key in .terraform/modules/ssh-key Initializing the backend... Initializing provider plugins... - Reusing previous version of digitalocean/digitalocean from the dependency lock file - Using previously-installed digitalocean/digitalocean v2.10.1 Terraform has been successfully initialized! ...

يمكنك الآن تخطيط الكود للتغييرات:

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

سوف تحصل على مخرج مماثل لهذا:

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: ... # module.ssh-key.digitalocean_ssh_key.default[0] will be created + resource "digitalocean_ssh_key" "default" { + fingerprint = (known after apply) + id = (known after apply) + name = "devops" + public_key = "ssh-rsa ... demo@clouddrove" } Plan: 4 to add, 0 to change, 0 to destroy. ...

يظهر المخرج أنك ستقوم بإنشاء مورد SSH ، مما يعني أنك قمت بتحميل وتطبيق الموديل من خلال برمجياتك.

نهاية

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-deploy-multiple-environments-with-workspaces-in-your-terraform-project