كيفية تشغيل Terraform على DigitalOcean

0 الأسهم
0
0
0
0

مقدمة

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

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

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

المتطلبات الأساسية
  • حساب DigitalOcean
  • رمز وصول شخصي إلى DigitalOcean يمكنك إنشاؤه من خلال لوحة تحكم DigitalOcean.
  • تمت إضافة مفتاح SSH بدون كلمة مرور إلى حسابك على DigitalOcean.
  • نطاق شخصي يشير إلى خادم يسمى DigitalOcean.

الخطوة 1 - تثبيت Terraform

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

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

على نظام macOS، استخدم هذا الأمر لتنزيل Terraform ووضعه في مجلدك الرئيسي:

curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_darwin_amd64.zip

في نظام لينكس، استخدم هذا الأمر:

curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_linux_amd64.zip

أنشئ مجلد ~/opt/terraform:

mkdir -p ~/opt/terraform

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

sudo apt install unzip

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

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

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

في نظام لينكس، يجب عليك تحديد متغير PATH في ملف bashrc، الذي يُنفذ عند فتح نافذة طرفية جديدة. افتحه للتعديل بتشغيل الأمر التالي:

nano ~/.bashrc

لإضافة مسار Terraform إلى PATH، أضف السطر التالي في نهاية الملف:

export PATH=$PATH:~/opt/terraform

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

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

. ~/.bashrc

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

. .bash_profile

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

. .zshrc

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

terraform

سترى مخرجات مشابهة لما يلي:

OutputUsage: 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 - تهيئة Terraform لـ DigitalOcean

يدعم Terraform مجموعة متنوعة من مزودي الخدمات الذين يمكنك تثبيتهم. لكل مزود مواصفاته الخاصة التي تعرض عادةً واجهة برمجة التطبيقات (API) الخاصة به.

يُمكّن موفر DigitalOcean برنامج Terraform من التفاعل مع واجهة برمجة تطبيقات DigitalOcean لإنشاء البنية التحتية. يدعم هذا الموفر إنشاء موارد DigitalOcean متنوعة، بما في ذلك:

  • digitalocean_droplet: Droplets (الخوادم)
  • موازن الأحمال في ديجيتال أوشن: موازن الأحمال
  • digitalocean_domain: إدخالات نطاق DNS
  • سجلات نظام أسماء النطاقات (DigitalOcean_record): سجلات نظام أسماء النطاقات (DNS)

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

export DO_PAT="your_personal_access_token"

أنشئ مجلدًا لتخزين إعدادات البنية التحتية الخاصة بك عن طريق تشغيل الأمر التالي:

mkdir ~/loadbalance

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

cd ~/loadbalance

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

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

لاستخدام موفر DigitalOcean مع Terraform، عليك تعريف Terraform به وتكوين الملحق باستخدام متغيرات بيانات الاعتماد المناسبة. أنشئ ملفًا باسم provider.tf لتخزين إعدادات الموفر.

nano provider.tf

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

terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}

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

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

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

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

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

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

...
provider "digitalocean" {
token = var.do_token
}

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

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

ملف 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"
}

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

terraform init

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

OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.34.1...
- Installed digitalocean/digitalocean v2.34.1 (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 لإنشاء خادم افتراضي (Droplet) على DigitalOcean، ثم تشغيله وتثبيت البرامج عليه. في هذه الخطوة، ستقوم بتوفير نظام Ubuntu 20.04 وتثبيت خادم الويب Nginx باستخدام Terraform.

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

nano 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 بمعالج واحد وذاكرة وصول عشوائي (RAM) سعتها 1 جيجابايت. (راجع جدول أحجام Slug للاطلاع على أحجام Slug المتاحة للاستخدام).

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

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

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

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

...
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 عند تشغيلها.

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

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

لاحظ أن السلاسل الموجودة في المصفوفة المضمنة هي الأوامر التي يقوم المستخدم الجذر بتشغيلها لتثبيت Nginx.

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

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",
# install nginx
"sudo apt update",
"sudo apt install -y nginx"
]
}
}

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

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

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

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

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

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

OutputTerraform 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 will be created
+ 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.

السطر + المورد "digitalocean_droplet" "www-1" يعني أن Terraform سينشئ مورد Droplet جديدًا باسم www-1 بالبيانات التالية. هذا هو المطلوب تمامًا، لذا شغّل أمر terraform application لتشغيل التطبيق الحالي.

terraform apply \
-var "do_token=${DO_PAT}" \
-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

أدخل "نعم" واضغط على زر الإدخال. يوفر لك Terraform Droplet ما يلي:

Outputdigitalocean_droplet.www-1: Creating...

بعد فترة، سترى Terraform يقوم بتثبيت Nginx باستخدام موفر 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 خادمًا جديدًا باسم www-1 وثبّت عليه Nginx. عند زيارة عنوان IP العام الخاص بخادمك الجديد، ستظهر لك صفحة الترحيب الخاصة بـ Nginx. يُعرض عنوان IP العام عند إنشاء الخادم، ولكن يمكنك دائمًا رؤيته من خلال عرض حالة Terraform الحالية. يقوم Terraform بتحديث ملف الحالة terraform.tfstate في كل مرة يُشغّل فيها خطة أو يُحدّث حالته.

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

terraform show terraform.tfstate

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

Outputresource "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"
...

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

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

الخطوة 5 - إنشاء خادم Nginx ثانٍ

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

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

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

يمكنك معرفة المزيد عن استخدام sed من خلال زيارة صفحة استخدام sed. سيد يتعلم أكثر.

لمعاينة التغييرات التي سيجريها Terraform، قم بتشغيل برنامج Terraform مرة أخرى:

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

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

OutputTerraform 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 will be created
+ 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 مرة أخرى لإنشاء الخادم الثاني:

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

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

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

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

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

الآن بعد أن أصبح لديك خادمان يعملان بنظام Nginx، ستقوم بتحديد ونشر موازن تحميل لتقسيم حركة المرور بينهما.

الخطوة 6 - موازنة الأحمال

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

ملف تكوين Terraform جديد يسمى loadbalancer.tf يخلق:

nano 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 ]
}

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

بعد ذلك، حدد فحص الحالة للتأكد من أن موازن التحميل متاح بالفعل بعد النشر:

check "health_check" {
data "http" "lb_check" {
url = "http://${digitalocean_loadbalancer.www-lb.ip}"
}
assert {
condition = data.http.lb_check.status_code == 200
error_message = "${data.http.lb_check.url} returned an unhealthy status code"
}
}

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

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

terraform plan \
-var "do_token=${DO_PAT}" \
-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
<= read (data resources)
Terraform will perform the following actions:
# data.http.lb_check will be read during apply
# (config refers to values not yet known)
<= data "http" "lb_check" {
+ body = (known after apply)
+ id = (known after apply)
+ response_body = (known after apply)
+ response_body_base64 = (known after apply)
+ response_headers = (known after apply)
+ status_code = (known after apply)
+ url = (known after apply)
}
# digitalocean_loadbalancer.www-lb will be created
+ resource "digitalocean_loadbalancer" "www-lb" {
+ algorithm = "round_robin"
+ disable_lets_encrypt_dns_records = false
+ droplet_ids = [
+ ...,
+ ...,
]
+ enable_backend_keepalive = false
+ enable_proxy_protocol = false
+ http_idle_timeout_seconds = (known after apply)
+ id = (known after apply)
+ ip = (known after apply)
+ name = "www-lb"
+ project_id = (known after apply)
+ 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
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
│ Warning: Check block assertion known after apply
│ on loadbalancer.tf line 27, in check "health_check":
│ 27: condition = data.http.lb_check.status_code == 200
│ ├────────────────
│ │ data.http.lb_check.status_code is a number
│
│ The condition could not be evaluated at this time, a result will be known when this plan is applied.
╵
...

بما أن القطرات www-1 و www-2 إنها موجودة بالفعل، يقوم Terraform Load Balancer بإنشاء www-lb ويتحقق منها بعد توفيرها.

قبل النشر، تحتاج إلى إعادة تشغيل المشروع لإضافة تبعية HTTP المستخدمة في فحص الصحة:

terraform init -upgrade

ثم قم بتشغيل تطبيق Terraform لإنشاء موازن الأحمال:

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

سيطلب منك برنامج Terraform مرة أخرى مراجعة الخطة. أكّد الخطة بإدخال "نعم" للمتابعة.

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

Output...
digitalocean_loadbalancer.www-lb: Creating...
...
digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id]
data.http.lb_check: Reading...
data.http.lb_check: Read complete after 0s [id=http://lb-ip]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...

لاحظ أن عملية lb_check قد اكتملت بنجاح.

من terraform show terraform.tfstate للعثور على عنوان IP الخاص بموازن الأحمال، استخدم ما يلي:

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://your_load_balancer_ip في متصفحك وسترى صفحة الترحيب الخاصة بـ Nginx حيث يقوم موازن التحميل بإعادة توجيه حركة المرور إلى أحد خادمي Nginx.

ستتعلم الآن كيفية تكوين نظام أسماء النطاقات (DNS) لحسابك على DigitalOcean باستخدام Terraform.

الخطوة 7 - إنشاء النطاقات وسجلات نظام أسماء النطاقات (DNS)

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

أنشئ ملفًا جديدًا لوصف نظام أسماء النطاقات (DNS) الخاص بك:

nano domain_root.tf

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

resource "digitalocean_domain" "default" {
name = "your_domain"
ip_address = digitalocean_loadbalancer.www-lb.ip
}

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

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

nano domain_cname.tf

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

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

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

لإضافة إدخالات نظام أسماء النطاقات (DNS)، التطبيق تحويل الأرض وثم تطبيق Terraform قم بتشغيله كأي مورد آخر.

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

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

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

أولاً، باستخدام خطة تحويل الأرض - تدميرها قم بوضع خطة تنفيذية لتدمير البنية التحتية:

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

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

ثم من تطبيق Terraform لتنفيذ الخطة، استخدم ما يلي:

terraform apply terraform.tfplan

سيستمر برنامج Terraform في تدمير الموارد وفقًا لما هو محدد في الخطة التي تم إنشاؤها.

نتيجة

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

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

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

قد يعجبك أيضاً