كيفية استخدام Terraform مع DigitalOcean

مقدمة

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

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

في هذا البرنامج التعليمي، ستقوم بتثبيت تيرافورم واستخدامه لإنشاء بنية تحتية على DigitalOcean تتكون من خادمين Nginx يتم توازن حمولتهما بواسطة موازن DigitalOcean Load Balancer. بعد ذلك، ستستخدم تيرافورم لإضافة إدخال DNS على DigitalOcean تشير إلى موازن الحمل الخاص بك. سيساعدك هذا في البدء في استخدام تيرافورم، وسيمنحك فكرة عن كيف يمكنك استخدامه لإدارة ونشر بنية تحتية مبنية على DigitalOcean تلبي احتياجاتك الخاصة.

ملاحظة: تم اختبار هذا البرنامج التعليمي مع تيرافورم 1.1.3.

المتطلبات الأولية

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

الخطوة 1 — تثبيت تيرافورم

تيرافورم هو أداة سطر الأوامر التي تقوم بتشغيلها على سطح مكتبك أو على خادم عن بُعد. لتثبيتها، ستقوم بتنزيلها ووضعها في مسار PATH الخاص بك حتى تتمكن من تنفيذها في أي دليل تعمل فيه.

أولاً، قم بتنزيل الحزمة المناسبة لنظام التشغيل والهندسة المعمارية الخاصة بك من صفحة التنزيلات الرسمية. إذا كنت تستخدم macOS أو Linux، يمكنك تنزيل تيرافورم باستخدام curl.

على macOS، استخدم هذا الأمر لتنزيل تيرافورم ووضعه في دليل المستخدم الخاص بك:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_darwin_amd64.zip

على Linux، استخدم هذا الأمر:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip

أنشئ الدليل ~/opt/terraform:

  1. mkdir -p ~/opt/terraform

ثم، قم بفك ضغط تيرافورم إلى ~/opt/terraform باستخدام أمر unzip. على Ubuntu، يمكنك تثبيت unzip باستخدام apt:

  1. sudo apt install unzip

استخدمه لاستخراج الأرشيف المنزل إلى دليل ~/opt/terraform عن طريق تشغيل:

  1. unzip ~/terraform.zip -d ~/opt/terraform

أضف أخيرًا ~/opt/terraform إلى متغير البيئة PATH حتى تتمكن من تنفيذ أمر terraform دون تحديد المسار الكامل إلى الملف التنفيذي.

على نظام Linux، ستحتاج إلى إعادة تعريف PATH في ملف .bashrc، الذي يعمل عند فتح شل جديد. قم بفتحه للتحرير عن طريق تشغيل:

  1. nano ~/.bashrc

ملاحظة: على نظام macOS، أضف المسار إلى الملف .bash_profile إذا كنت تستخدم Bash، أو إلى .zshrc إذا كنت تستخدم ZSH.

لإلحاق مسار Terraform بـ PATH الخاص بك، أضف السطر التالي في نهاية الملف:

.bashrc
export PATH=$PATH:~/opt/terraform

احفظ وأغلق الملف عند الانتهاء.

الآن ستتمكن جلسات الشل الجديدة الخاصة بك من العثور على أمر terraform. لتحميل المسار الجديد PATH في جلستك الحالية، قم بتشغيل الأمر التالي إذا كنت تستخدم Bash على نظام Linux:

  1. . ~/.bashrc

إذا كنت تستخدم Bash على macOS، قم بتنفيذ هذا الأمر بدلاً من ذلك:

  1. . .bash_profile

إذا كنت تستخدم ZSH، قم بتشغيل هذا الأمر:

  1. . .zshrc

للتحقق من تثبيت Terraform بشكل صحيح، قم بتشغيل أمر terraform بدون معاملات:

  1. terraform

سترى إخراجًا مماثلاً للتالي:

Output
Usage: terraform [global options] <subcommand> [args] The available commands for execution are listed below. The primary workflow commands are given first, followed by less common or more advanced commands. Main commands: init Prepare your working directory for other commands validate Check whether the configuration is valid plan Show changes required by the current configuration apply Create or update infrastructure destroy Destroy previously-created infrastructure All other commands: console Try Terraform expressions at an interactive command prompt fmt Reformat your configuration in the standard style force-unlock Release a stuck lock on the current workspace get Install or upgrade remote Terraform modules graph Generate a Graphviz graph of the steps in an operation import Associate existing infrastructure with a Terraform resource login Obtain and save credentials for a remote host logout Remove locally-stored credentials for a remote host output Show output values from your root module providers Show the providers required for this configuration refresh Update the state to match remote systems show Show the current state or a saved plan state Advanced state management taint Mark a resource instance as not fully functional test Experimental support for module integration testing untaint Remove the 'tainted' state from a resource instance version Show the current Terraform version workspace Workspace management Global options (use these before the subcommand, if any): -chdir=DIR Switch to a different working directory before executing the given subcommand. -help Show this help output, or the help for a specified subcommand. -version An alias for the "version" subcommand.

هذه هي الأوامر التي يقبلها Terraform. يعطي الإخراج وصفًا موجزًا، وستتعرف على المزيد عنها خلال هذا البرنامج التعليمي.

الآن بعد تثبيت Terraform، دعنا نقوم بتكوينه للعمل مع موارد DigitalOcean.

الخطوة 2 — تكوين تيرافورم لـ DigitalOcean

يدعم تيرافورم مجموعة متنوعة من مزودي الخدمات من خلال مزودات يمكنك تثبيتها. كل مزود لديه مواصفاته الخاصة، والتي عمومًا تتطابق مع واجهة برمجة التطبيقات لمزود الخدمة الخاص به.

يتيح مزود DigitalOcean لتيرافورم التفاعل مع واجهة برمجة التطبيقات الخاصة بـ DigitalOcean لبناء البنية التحتية. يدعم هذا المزود إنشاء موارد DigitalOcean مختلفة، بما في ذلك ما يلي:

  • digitalocean_droplet: الـ Droplets (الخوادم)
  • digitalocean_loadbalancer: موازنات الحمل
  • digitalocean_domain: مدخلات نطاق DNS
  • digitalocean_record: سجلات DNS

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

  1. export DO_PAT="your_personal_access_token"

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

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

قم بإنشاء دليل سيحتوي على تكوين البنية التحتية الخاصة بك عن طريق تشغيل الأمر التالي:

  1. mkdir ~/loadbalance

انتقل إلى الدليل الذي تم إنشاؤه حديثًا:

  1. cd ~/loadbalance

ملفات تكوين Terraform هي ملفات نصية تنتهي بامتداد الملف .tf. إنها قابلة للقراءة من قبل الإنسان وتدعم التعليقات. (تدعم Terraform أيضًا ملفات تكوين بتنسيق JSON، ولكن لن يتم التطرق إليها هنا.) سوف يقرأ Terraform جميع ملفات التكوين في دليل العمل الخاص بك بطريقة تصريحية، لذا لا يهم ترتيب تعريفات الموارد والمتغيرات. يمكن أن تكون بنية البنية التحتية بأكملها في ملف تكوين واحد، ولكن يجب عليك فصل ملفات التكوين حسب نوع المورد للحفاظ على الوضوح.

الخطوة الأولى لبناء بنية تحتية باستخدام Terraform هي تحديد الموفر الذي ستستخدمه.

لاستخدام موفر DigitalOcean مع Terraform، يجب عليك إبلاغ Terraform عن ذلك وتكوين المكون الإضافي بالمتغيرات المناسبة للتحقق من الأمان. قم بإنشاء ملف يُسمى provider.tf، الذي سيحتوي على تكوين الموفر:

  1. nano provider.tf

أضف الأسطر التالية إلى الملف لإبلاغ Terraform بأنك ترغب في استخدام موفر DigitalOcean، وأوجد Terraform حيث يمكن العثور عليه:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

ثم، قم بتعريف المتغيرات التالية في الملف حتى تتمكن من الإشارة إليها في بقية ملفات التكوين الخاصة بك:

  • do_token: رمز الوصول الشخصي الخاص بـ DigitalOcean الخاص بك.
  • pvt_key: موقع المفتاح الخاص، حتى يتمكن Terraform من استخدامه لتسجيل الدخول إلى Droplets الجديدة وتثبيت Nginx.

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

لتعريف هذه المتغيرات، أضف هذه الأسطر إلى الملف:

~/loadbalance/provider.tf
...
variable "do_token" {}
variable "pvt_key" {}

ثم، أضف هذه الأسطر لتكوين موفر DigitalOcean وتحديد بيانات اعتماد حساب DigitalOcean الخاص بك عن طريق تعيين do_token إلى وسيطة token للمزود:

~/loadbalance/provider.tf
...
provider "digitalocean" {
  token = var.do_token
}

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

~/loadbalance/provider.tf
...
data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

سيبدو ملف provider.tf الخاص بك بعد الانتهاء كما يلي:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

variable "do_token" {}
variable "pvt_key" {}

provider "digitalocean" {
  token = var.do_token
}

data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

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

ملاحظة: ضبط المتغير البيئي TF_LOG إلى 1 سيتيح تسجيل تفصيلي لما يحاول Terraform القيام به. يمكنك ضبطه عن طريق تشغيل:

  1. export TF_LOG=1

قم بتهيئة Terraform لمشروعك عن طريق تشغيل:

  1. terraform init

سيقوم هذا بقراءة تكوينك وتثبيت الوصلات الإضافية لموفرك. سترى ذلك مسجلًا في الإخراج:

Output
Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) 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.

إذا حدث أن واجهت مشكلة، ولم يعمل Terraform كما توقعت، يمكنك البدء من جديد بحذف ملف terraform.tfstate وتدمير الموارد التي تم إنشاؤها يدويًا (على سبيل المثال، من خلال لوحة التحكم).

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

الخطوة 3 — تحديد أول خادم Nginx

يمكنك استخدام Terraform لإنشاء DigitalOcean Droplet وتثبيت البرمجيات على Droplet بمجرد تشغيلها. في هذه الخطوة، ستقوم بتوفير Droplet Ubuntu 20.04 وتثبيت خادم ويب Nginx باستخدام Terraform.

أنشئ ملف تكوين Terraform جديد يسمى www-1.tf، الذي سيحتوي على تكوين Droplet:

  1. nano www-1.tf

أدخل السطور التالية لتحديد مورد Droplet:

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
    image = "ubuntu-20-04-x64"
    name = "www-1"
    region = "nyc3"
    size = "s-1vcpu-1gb"
    ssh_keys = [
      data.digitalocean_ssh_key.terraform.id
    ]

في التكوين السابق، تحدد السطر الأول موردًا digitalocean_droplet بالاسم www-1. تحدد بقية الأسطر خصائص Droplet، بما في ذلك مركز البيانات الذي سيتواجد فيه والـ slug الذي يحدد حجم Droplet الذي تريد تكوينه. في هذه الحالة، ستستخدم s-1vcpu-1gb، والذي سينشئ Droplet بمعالج واحد و 1 جيجابايت من ذاكرة الوصول العشوائي (قم بزيارة جدول مقاسات الـ slugs هذا لرؤية الـ slugs المتاحة التي يمكنك استخدامها).

القسم ssh_keys يحدد قائمة من المفاتيح العامة التي ترغب في إضافتها إلى Droplet. في هذه الحالة، أنت تحدد المفتاح الذي قمت بتعريفه في provider.tf. تأكد من أن الاسم هنا يتطابق مع الاسم الذي حددته في provider.tf.

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

إذا كنت تتساءل عن الوسائط المطلوبة أو الاختيارية لمورد Droplet، يرجى الرجوع إلى وثائق Terraform الرسمية: DigitalOcean Droplet Specification.

لإعداد connection التي يمكن لـ Terraform استخدامها للاتصال بالخادم عبر SSH، قم بإضافة الأسطر التالية في نهاية الملف:

~/loadbalance/www-1.tf
...
connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }

تصف هذه الأسطر كيفية يجب على Terraform الاتصال بالخادم، بحيث يمكن لـ Terraform الاتصال عبر SSH لتثبيت Nginx. لاحظ استخدام متغير المفتاح الخاص var.pvt_key – ستمرر قيمته عند تشغيل Terraform.

الآن بعد أن قمت بإعداد الاتصال، قم بتكوين provisioner remote-exec، الذي ستستخدمه لتثبيت Nginx. أضف الأسطر التالية إلى التكوين للقيام بذلك:

~/loadbalance/www-1.tf
...
provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # تثبيت nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

لاحظ أن السلاسل في مصفوفة inline هي الأوامر التي سيراها المستخدم root لتثبيت Nginx.

يبدو الملف المكتمل مثل هذا:

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
  image = "ubuntu-20-04-x64"
  name = "www-1"
  region = "nyc3"
  size = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]
  
  connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }
  
  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # تثبيت nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

حفظ الملف والخروج من المحرر. لقد قمت بتعريف الخادم، وأنت الآن جاهز لنشره، والذي ستقوم به الآن.

الخطوة 4 — استخدام Terraform لإنشاء خادم Nginx

تصف التكوين الحالي لـ Terraform خادم Nginx واحدًا. ستقوم الآن بنشر الـ Droplet بالضبط كما هو محدد.

قم بتشغيل الأمر terraform plan لرؤية خطة التنفيذ، أو ما ستحاول Terraform فعله لبناء البنية التحتية التي وصفتها. ستضطر إلى تحديد قيم لرمز الوصول الخاص بـ DigitalOcean ومسار المفتاح الخاص بك، حيث يستخدم التكوين هذه المعلومات للوصول إلى الـ Droplet الخاص بك لتثبيت Nginx. قم بتشغيل الأمر التالي لإنشاء خطة:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

تحذير: يدعم أمر terraform plan معلمة -out لحفظ الخطة. ومع ذلك، ستقوم الخطة بتخزين مفاتيح API، ولا تقوم Terraform بتشفير هذه البيانات. عند استخدام هذا الخيار، يجب عليك استكشاف تشفير هذا الملف إذا كنت تخطط لإرساله للآخرين أو تركه في حالة سكون لفترة طويلة من الزمن.

سوف ترى مخرجات مشابهة لهذه:

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.www-1 سيتم إنشاؤه + resource "digitalocean_droplet" "www-1" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + 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 = "www-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "nyc3" + 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) } Plan: 1 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

السطر + resource "digitalocean_droplet" "www-1" يعني أن Terraform ستنشئ موردًا جديدًا من نوع Droplet يُسمى www-1، مع التفاصيل التي تليه. هذا بالضبط ما يجب أن يحدث، لذا قم بتشغيل الأمر terraform apply لتنفيذ الخطة الحالية:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

سوف تحصل على نفس الإخراج كما كان من قبل، ولكن هذه المرة، سيطلب منك Terraform موافقتك على المتابعة:

Output
... Plan: 1 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 واضغط على ENTER. سيقوم Terraform بتوفير Droplet الخاص بك:

Output
digitalocean_droplet.www-1: Creating...

بعد فترة من الوقت، سترى Terraform يثبت Nginx باستخدام provisioner remote-exec، ثم ستكتمل العملية:

Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'... .... digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

قام Terraform بإنشاء Droplet جديد يُسمى www-1 وثبت Nginx عليه. إذا زرت عنوان IP العام لـ Droplet الجديد الخاص بك، سترى شاشة ترحيب Nginx. تم عرض العنوان IP العام عند إنشاء Droplet، ولكن يمكنك دائمًا عرضه عند النظر إلى حالة Terraform الحالية. يقوم Terraform بتحديث ملف الحالة terraform.tfstate في كل مرة ينفذ فيها خطة أو يقوم بتحديث حالته.

لعرض الحالة الحالية لبيئتك، استخدم الأمر التالي:

  1. terraform show terraform.tfstate

سيظهر لك عنوان IP العام لـ Droplet الخاص بك.

Output
resource "digitalocean_droplet" "www-1" { backups = false created_at = "..." disk = 25 id = "your_www-1_droplet_id" image = "ubuntu-20-04-x64" ipv4_address = "your_www-1_server_ip" ipv4_address_private = "10.128.0.2" ...

انتقل إلى http://your_www-1_server_ip في متصفحك للتحقق من تشغيل خادم Nginx الخاص بك.

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

  1. terraform refresh \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

في هذه الخطوة ، لقد قمت بنشر Droplet الذي وصفته في Terraform. الآن ستقوم بإنشاء آخر.

الخطوة 5 — إنشاء الخادم الثاني لـ Nginx

الآن بعد أن قمت بوصف خادم Nginx ، يمكنك إضافة الثاني بسرعة عن طريق نسخ ملف تكوين الخادم الحالي واستبدال اسم واسم المضيف لموارد Droplet.

يمكنك القيام بذلك يدوياً ، ولكن من الأسرع استخدام أمر sed لقراءة ملف www-1.tf ، واستبدال جميع الحالات من www-1 بـ www-2 ، وإنشاء ملف جديد يسمى www-2.tf. إليك الأمر sed للقيام بذلك:

  1. sed 's/www-1/www-2/g' www-1.tf > www-2.tf

يمكنك معرفة المزيد عن sed عن طريق زيارة استخدام sed.

قم بتشغيل terraform plan مرة أخرى لمعاينة التغييرات التي ستقوم Terraform بإجرائها:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

يظهر الإخراج أن Terraform سيقوم بإنشاء الخادم الثاني ، www-2:

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.www-2 سيتم إنشاؤه + resource "digitalocean_droplet" "www-2" { + 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 = "www-2" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = true + region = "nyc3" + 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) } Plan: 1 to add, 0 to change, 0 to destroy. ...

تشغيل أمر terraform apply مرة أخرى لإنشاء الـ Droplet الثاني:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

كما في السابق، سيطلب منك Terraform تأكيد رغبتك في المتابعة. قم بمراجعة الخطة مرة أخرى واكتب yes للمتابعة.

بعد بعض الوقت، سيقوم Terraform بإنشاء الخادم الجديد وعرض النتائج:

Output
digitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

أنشأ Terraform الخادم الجديد، دون تعديل الخادم الحالي. يمكنك تكرار هذه الخطوة لإضافة خوادم Nginx إضافية.

الآن بعد أن لديك Droplets الثاني يعمل بـ Nginx، ستقوم بتعريف ونشر موازن الحمل لتقسيم حركة المرور بينهما.

الخطوة 6 — إنشاء موازن الحمل

ستستخدم موازن حمل DigitalOcean، الذي يدعمه موفر Terraform الرسمي، لتوجيه حركة المرور بين خادمي الويب الاثنين.

أنشئ ملف تكوين Terraform جديد يسمى loadbalancer.tf:

  1. nano loadbalancer.tf

أضف الأسطر التالية لتعريف موازن الحمل:

~/loadbalance/loadbalancer.tf
resource "digitalocean_loadbalancer" "www-lb" {
  name = "www-lb"
  region = "nyc3"

  forwarding_rule {
    entry_port = 80
    entry_protocol = "http"

    target_port = 80
    target_protocol = "http"
  }

  healthcheck {
    port = 22
    protocol = "tcp"
  }

  droplet_ids = [digitalocean_droplet.www-1.id, digitalocean_droplet.www-2.id ]
}

يحدد تعريف موازن الحمل اسمه ومركز البيانات الذي سيكون فيه، والمنافذ التي يجب أن يستمع إليها لتوازن حركة المرور، والتكوين لفحص الصحة، ومعرفات الـ Droplets التي يجب أن يوازن بينها، والتي تُحضر باستخدام المتغيرات في Terraform. احفظ وأغلق الملف.

قم بتشغيل أمر terraform plan مرة أخرى لمراجعة الخطة التنفيذية الجديدة:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

سترى عدة سطور من الإخراج، بما في ذلك السطور التالية:

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_loadbalancer.www-lb سيتم إنشاؤه + resource "digitalocean_loadbalancer" "www-lb" { + algorithm = "round_robin" + disable_lets_encrypt_dns_records = false + droplet_ids = [ + ..., + ..., ] + enable_backend_keepalive = false + enable_proxy_protocol = false + id = (known after apply) + ip = (known after apply) + name = "www-lb" + redirect_http_to_https = false + region = "nyc3" + size_unit = (known after apply) + status = (known after apply) + urn = (known after apply) + vpc_uuid = (known after apply) + forwarding_rule { + certificate_id = (known after apply) + certificate_name = (known after apply) + entry_port = 80 + entry_protocol = "http" + target_port = 80 + target_protocol = "http" + tls_passthrough = false } + healthcheck { + check_interval_seconds = 10 + healthy_threshold = 5 + port = 22 + protocol = "tcp" + response_timeout_seconds = 5 + unhealthy_threshold = 3 } + sticky_sessions { + cookie_name = (known after apply) + cookie_ttl_seconds = (known after apply) + type = (known after apply) } } Plan: 1 to add, 0 to change, 0 to destroy. ...

هذا يعني أن الـ Droplets www-1 و www-2 موجودة بالفعل، وسيقوم Terraform بإنشاء Load Balancer www-lb.

قم بتشغيل terraform apply لبناء Load Balancer:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

مرة أخرى، سيطلب منك Terraform مراجعة الخطة. قم بالموافقة على الخطة عن طريق إدخال yes للمتابعة.

بمجرد فعلك ذلك، سترى إخراجًا يحتوي على السطور التالية، مقتصرة للحصول على الإيجاز:

Output
... digitalocean_loadbalancer.www-lb: Creating... ... digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

استخدم terraform show terraform.tfstate للعثور على عنوان IP الخاص بك Load Balancer:

  1. terraform show terraform.tfstate

ستجد عنوان IP تحت الإدخال www-lb:

Output
... # digitalocean_loadbalancer.www-lb: resource "digitalocean_loadbalancer" "www-lb" { algorithm = "round_robin" disable_lets_encrypt_dns_records = false droplet_ids = [ your_www-1_droplet_id, your_www-2_droplet_id, ] enable_backend_keepalive = false enable_proxy_protocol = false id = "your_load_balancer_id" ip = "your_load_balancer_ip" name = "www-lb" ...

انتقل إلى http://عنوان_IP_الموزع_الخاص_بك في متصفحك وسترى شاشة ترحيب Nginx لأن Load Balancer يقوم بإرسال حركة المرور إلى أحد خادمي Nginx الاثنين.

الآن سوف تتعلم كيفية تكوين DNS لحسابك على DigitalOcean باستخدام Terraform.

الخطوة 7 — إنشاء نطاقات DNS وسجلات

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

ملاحظة: استخدم اسم نطاقك الفريد الخاص أو سيكون Terraform غير قادر على نشر الموارد DNS. تأكد من أن نطاقك موجه إلى خوادم أسماء DigitalOcean.

أنشئ ملفًا جديدًا لوصف DNS الخاص بك:

  1. nano domain_root.tf

أضف مورد النطاق التالي ، مستبدلًا your_domain باسم النطاق الخاص بك:

~/loadbalance/domain_root.tf
resource "digitalocean_domain" "default" {
   name = "your_domain"
   ip_address = digitalocean_loadbalancer.www-lb.ip
}

احفظ وأغلق الملف عند الانتهاء.

يمكنك أيضًا إضافة سجل CNAME يشير www.your_domain إلى your_domain. أنشئ ملفًا جديدًا لسجل CNAME:

  1. nano domain_cname.tf

أضف هذه الأسطر إلى الملف:

domain_cname.tf
resource "digitalocean_record" "CNAME-www" {
  domain = digitalocean_domain.default.name
  type = "CNAME"
  name = "www"
  value = "@"
}

احفظ وأغلق الملف عند الانتهاء.

لإضافة مدخلات DNS ، قم بتشغيل terraform plan تلاه terraform apply ، كما هو الحال مع الموارد الأخرى.

انتقل إلى اسم نطاقك وسترى شاشة ترحيب Nginx لأن النطاق يشير إلى توازن الحمل ، الذي يقوم بإرسال حركة المرور إلى أحد خادمي Nginx الاثنين.

الخطوة 8 — تدمير البنية التحتية الخاصة بك

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

أولاً، قم بإنشاء خطة تنفيذ لتدمير البنية التحتية باستخدام terraform plan -destroy:

  1. terraform plan -destroy -out=terraform.tfplan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

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

ثم، استخدم terraform apply لتشغيل الخطة:

  1. terraform apply terraform.tfplan

ستقوم Terraform بمتابعة تدمير الموارد، كما هو موضح في الخطة المولدة.

الاستنتاج

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

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

تتمتع Terraform بالعديد من الميزات الإضافية، ويمكنها العمل مع مزودين آخرين. تفضل بزيارة توثيق Terraform الرسمي لمعرفة المزيد حول كيفية استخدام Terraform لتحسين البنية التحتية الخاصة بك.

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean