مقدمه
Terraform ابزاری برای ایجاد و مدیریت زیرساخت ها به صورت سازمان یافته است. میتوانید از آن برای مدیریت DigitalOcean Droplets، Load Balancers، و حتی ورودیهای DNS، علاوه بر طیف گستردهای از خدمات ارائهشده توسط سایر ارائهدهندگان استفاده کنید. Terraform از یک رابط خط فرمان استفاده می کند و می تواند از دسکتاپ شما یا یک سرور راه دور اجرا شود.
Terraform با خواندن فایلهای پیکربندی که اجزایی را که محیط برنامه یا مرکز داده شما را تشکیل میدهند، کار میکند. بر اساس پیکربندی، یک برنامه اجرایی ایجاد می کند که توصیف می کند برای رسیدن به وضعیت مطلوب چه کاری انجام می دهد. سپس از Terraform برای اجرای این طرح برای ساخت زیرساخت استفاده می کنید. هنگامی که تغییراتی در پیکربندی رخ می دهد، Terraform می تواند برنامه های افزایشی را برای به روز رسانی زیرساخت موجود به وضعیت جدید توصیف شده ایجاد و اجرا کند.
در این آموزش، Terraform را نصب میکنید و از آن برای ایجاد زیرساختی در DigitalOcean استفاده میکنید که از دو سرور Nginx تشکیل شده است که توسط یک DigitalOcean Load Balancer با بار متعادل میشوند. سپس، از Terraform برای اضافه کردن یک ورودی DNS در DigitalOcean که به Load Balancer اشاره می کند، استفاده خواهید کرد. این به شما کمک می کند تا با استفاده از Terraform شروع کنید و به شما ایده می دهد که چگونه می توانید از آن برای مدیریت و استقرار یک زیرساخت مبتنی بر DigitalOcean که نیازهای شما را برآورده می کند استفاده کنید.
پیش نیازها
- یک حساب DigitalOcean
- یک رمز دسترسی شخصی DigitalOcean که می توانید از طریق کنترل پنل DigitalOcean ایجاد کنید.
- یک کلید SSH بدون رمز عبور به حساب DigitalOcean شما اضافه شده است.
- دامنه شخصی به سرور که به نام DigitalOcean اشاره می کند.
مرحله 1 – نصب Terraform
Terraform یک ابزار خط فرمان است که روی دسکتاپ یا سرور راه دور اجرا می کنید. برای نصب آن، آن را دانلود کرده و در PATH خود قرار می دهید تا بتوانید آن را در هر دایرکتوری که در آن کار می کنید اجرا کنید.
ابتدا بسته مناسب برای سیستم عامل و معماری خود را از صفحه رسمی دانلودها دانلود کنید. اگر از macOS یا لینوکس استفاده می کنید، می توانید Terraform را با کرل دانلود کنید.
در 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 را با استفاده از دستور unzip به ~/opt/terraform باز کنید. در اوبونتو، می توانید 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 را پیدا کنند. برای بارگذاری PATH جدید در جلسه فعلی خود، اگر از Bash در سیستم لینوکس استفاده می کنید، دستور زیر را اجرا کنید:
. ~/.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 API تعامل داشته باشد تا زیرساخت ایجاد کند. این ارائه دهنده از ایجاد منابع مختلف DigitalOcean از جمله موارد زیر پشتیبانی می کند:
- digitalocean_droplet: Droplets (سرورها)
- digitalocean_loadbalancer: متعادل کننده بار
- digitalocean_domain: ورودی های دامنه DNS
- digitalocean_record: رکوردهای DNS
Terraform از رمز دسترسی شخصی DigitalOcean شما برای برقراری ارتباط با DigitalOcean API و مدیریت منابع در حساب شما استفاده می کند. این کلید را با دیگران به اشتراک نگذارید و آن را خارج از کنترل اسکریپت و نسخه نگه دارید. رمز دسترسی شخصی 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"
}
}
}
سپس، متغیرهای زیر را در فایل تعریف کنید تا بتوانید در بقیه فایلهای پیکربندی خود به آنها ارجاع دهید:
do_token
: رمز دسترسی شخصی DigitalOcean شما.pvt_key
: مکان کلید خصوصی، بنابراین Terraform می تواند از آن برای ورود به Droplets جدید و نصب Nginx استفاده کند.
شما مقادیر این متغیرها را هنگام اجرای آن به Terraform منتقل میکنید، نه با کدگذاری سخت مقادیر در اینجا. این باعث می شود پیکربندی قابل حمل تر باشد.
برای تعریف این متغیرها، این خطوط را به فایل اضافه کنید:
...
variable "do_token" {}
variable "pvt_key" {}
سپس، این خطوط را برای پیکربندی ارائهدهنده DigitalOcean اضافه کنید و اعتبار حساب DigitalOcean خود را با اختصاص do_token
به آرگومان Token
ارائهدهنده مشخص کنید:
...
provider "digitalocean" {
token = var.do_token
}
در نهایت، میخواهید که Terraform به طور خودکار کلید SSH شما را به هر قطره جدیدی که ایجاد میکنید اضافه کند. وقتی کلید SSH خود را به DigitalOcean اضافه کردید، نامی به آن دادید. Terraform می تواند از این نام برای بازیابی کلید عمومی استفاده کند. این خطوط را اضافه کنید و نام کلیدی را که در حساب DigitalOcean خود ارائه کرده اید جایگزین terraform
کنید:
...
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 برای تعریف قطره ای استفاده می کنید که سرور Nginx را اجرا می کند.
مرحله 3 – تعریف اولین سرور Nginx
میتوانید از Terraform برای ایجاد DigitalOcean Droplet استفاده کنید و پس از چرخش آن، نرمافزار را روی Droplet نصب کنید. در این مرحله، یک Ubuntu 20.04 را تهیه کرده و وب سرور Nginx را با استفاده از Terraform نصب خواهید کرد.
یک فایل پیکربندی Terraform جدید به نام www-1.tf
ایجاد کنید که پیکربندی Droplet را نگه می دارد:
nano www-1.tf
خطوط زیر را برای تعریف منبع Droplet وارد کنید:
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 که اندازه قطرهای را که میخواهید پیکربندی کنید، مشخص میکند. در این مورد، شما از s-1vcpu-1gb استفاده می کنید که یک Droplet با یک CPU و 1GB RAM ایجاد می کند. (از این نمودار سایز اسلاگ دیدن کنید تا اسلاگ های موجود را که می توانید استفاده کنید ببینید.)
بخش ssh_keys
لیستی از کلیدهای عمومی را که می خواهید به Droplet اضافه کنید مشخص می کند. در این مورد، شما کلیدی را که در provider.tf
تعریف کرده اید، مشخص می کنید. اطمینان حاصل کنید که نام اینجا با نامی که در provider.tf
مشخص کرده اید مطابقت داشته باشد.
هنگامی که Terraform را در برابر DigitalOcean API اجرا می کنید، اطلاعات مختلفی را در مورد Droplet جمع آوری می کند، مانند آدرس های IP عمومی و خصوصی آن. این اطلاعات می تواند توسط منابع دیگر در پیکربندی شما استفاده شود.
اگر نمیدانید کدام آرگومانها برای منبع Droplet مورد نیاز یا اختیاری هستند، لطفاً به مستندات رسمی Terraform مراجعه کنید: DigitalOcean Droplet Specification
برای راه اندازی یک اتصال که 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 plan
را اجرا کنید تا برنامه اجرایی را ببینید، یا اینکه Terraform برای ساخت زیرساختی که توضیح دادید تلاش می کند انجام دهد. شما باید مقادیر را برای DigitalOcean Access Token و مسیر کلید خصوصی خود را مشخص کنید، زیرا پیکربندی شما از این اطلاعات برای دسترسی به 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
بله را وارد کرده و ENTER را فشار دهید. 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 یک Droplet جدید به نام www-1 ایجاد کرده و Nginx را روی آن نصب کرده است. اگر از آدرس IP عمومی Droplet جدید خود بازدید کنید، صفحه خوش آمدگویی Nginx را خواهید دید. IP عمومی هنگام ایجاد Droplet نمایش داده می شود، اما همیشه می توانید با مشاهده وضعیت فعلی 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 توضیح دادهاید، مستقر کردهاید. اکنون یک مورد دوم ایجاد خواهید کرد.
مرحله 5 – ایجاد دومین سرور Nginx
اکنون که یک سرور Nginx را توصیف کردهاید، میتوانید با کپی کردن فایل پیکربندی سرور موجود و جایگزینی نام و نام میزبان منبع Droplet، به سرعت یک ثانیه اضافه کنید.
شما می توانید این کار را به صورت دستی انجام دهید، اما استفاده از دستور sed
برای خواندن فایل www-1.tf
، جایگزینی تمام نمونه های www-1
با www-2
و ایجاد یک فایل جدید به نام www-2.tf
سریعتر است. در اینجا دستور sed
برای انجام این کار وجود دارد:
sed 's/www-1/www-2/g' www-1.tf > www-2.tf
با مراجعه به Using 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 application را برای ایجاد قطره دوم اجرا کنید:
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 اضافی می توانید این مرحله را تکرار کنید.
اکنون که دو Droplet دارید که Nginx را اجرا می کنند، یک بار متعادل کننده را برای تقسیم ترافیک بین آنها تعریف و مستقر خواهید کرد.
مرحله 6 – ایجاد تعادل بار
شما از DigitalOcean Load Balancer، که ارائه دهنده رسمی Terraform از آن پشتیبانی می کند، برای هدایت ترافیک بین دو سرور وب استفاده خواهید کرد.
یک فایل پیکربندی Terraform جدید به نام loadbalancer.tf
ایجاد کنید:
nano loadbalancer.tf
خطوط زیر را برای تعریف Load Balancer اضافه کنید:
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 ]
}
تعریف Load Balancer نام آن، مرکز دادهای که در آن قرار خواهد گرفت، پورتهایی که باید به آن گوش دهد تا ترافیک را متعادل کند، پیکربندی برای بررسی سلامت و شناسههای قطرههایی که باید تعادل داشته باشد را مشخص میکند که با استفاده از متغیرهای Terraform واکشی میکنید.
سپس، یک بررسی وضعیت تعریف کنید تا مطمئن شوید که Load Balancer واقعاً پس از استقرار در دسترس است:
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 Load Balancer را از طریق HTTP درخواست میکند و تأیید میکند که کد برگشتی 200 است، که نشاندهنده سالم بودن و در دسترس بودن قطرات است. در صورت بروز خطا یا کد برگشتی متفاوت، پس از مراحل استقرار اخطار نمایش داده می شود.وقتی کارتان تمام شد، فایل را ذخیره و ببندید.
دوباره دستور terraform plan
را اجرا کنید تا برنامه اجرایی جدید را مرور کنید:
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 مورد استفاده در health_check را اضافه کنید:
terraform init -upgrade
سپس، terraform application را برای ساخت Load Balancer اجرا کنید:
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 Load Balancer خود استفاده کنید:
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 را مشاهده خواهید کرد زیرا Load Balancer ترافیک را به یکی از دو سرور Nginx ارسال می کند.
اکنون می آموزید که چگونه DNS را برای حساب DigitalOcean خود با استفاده از Terraform پیکربندی کنید.
مرحله 7 – ایجاد دامنه ها و سوابق DNS
علاوه بر Droplets و Load Balancer، 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
را به your_domain
نشان دهد. یک فایل جدید برای رکورد CNAME ایجاد کنید:
nano domain_cname.tf
این خطوط را به فایل اضافه کنید:
resource "digitalocean_record" "CNAME-www" {
domain = digitalocean_domain.default.name
type = "CNAME"
name = "www"
value = "@"
}
پس از اتمام، فایل را ذخیره کرده و ببندید.
برای افزودن ورودیهای DNS، برنامه terraform
و سپس terraform application
را مانند سایر منابع اجرا کنید.
به نام دامنه خود بروید و صفحه خوش آمدگویی Nginx را مشاهده خواهید کرد زیرا دامنه به Load Balancer اشاره می کند که ترافیک را به یکی از دو سرور Nginx ارسال می کند.
مرحله 8 – زیرساخت خود را از بین ببرید
اگرچه Terraform معمولاً در محیطهای تولید استفاده نمیشود، اما میتواند زیرساختهای ایجاد شده را نیز از بین ببرد. این به طور عمده در محیط های توسعه که چندین بار مستقر و نابود می شوند مفید است.
ابتدا با استفاده از terraform plan -destroy
یک برنامه اجرایی برای تخریب زیرساخت ایجاد کنید:
terraform plan -destroy -out=terraform.tfplan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"
Terraform طرحی را با منابعی که با رنگ قرمز مشخص شده اند، و با علامت منفی پیشوند، خروجی می دهد که نشان می دهد منابع زیرساخت شما را حذف می کند.
سپس از terraform application
برای اجرای طرح استفاده کنید:
terraform apply terraform.tfplan
Terraform همانطور که در طرح تولید شده مشخص شده است، به تخریب منابع ادامه می دهد.
نتیجه
در این آموزش، شما از Terraform برای ایجاد یک زیرساخت وب متعادل با بار در DigitalOcean استفاده کردید، با دو سرور وب Nginx که پشت یک DigitalOcean Load Balancer اجرا میشوند. شما می دانید که چگونه منابع را ایجاد و نابود کنید، وضعیت فعلی را مشاهده کنید و از Terraform برای پیکربندی ورودی های DNS استفاده کنید.
اکنون که فهمیدید Terraform چگونه کار می کند، می توانید فایل های پیکربندی ایجاد کنید که زیرساخت سرور را برای پروژه های شما توصیف می کند. مثال در این آموزش نقطه شروع خوبی است که نشان می دهد چگونه می توانید استقرار سرورها را خودکار کنید. اگر قبلاً از ابزارهای تأمین استفاده میکنید، میتوانید آنها را با Terraform ادغام کنید تا به جای استفاده از روش تأمین مورد استفاده در این آموزش، سرورها را به عنوان بخشی از فرآیند ایجاد آنها پیکربندی کنید.
Terraform ویژگی های بسیار بیشتری دارد و می تواند با سایر ارائه دهندگان کار کند. برای کسب اطلاعات بیشتر در مورد نحوه استفاده از Terraform برای بهبود زیرساخت خود، اسناد رسمی Terraform را بررسی کنید. این آموزش بخشی از مجموعه نحوه مدیریت زیرساخت با Terraform است. این مجموعه تعدادی از موضوعات Terraform را پوشش می دهد، از نصب Terraform برای اولین بار تا مدیریت پروژه های پیچیده.