כיצד להשתמש ב- Terraform עם DigitalOcean

הקדמה

Terraform הוא כלי לבניית וניהול תשתיות באופן מאורגן. ניתן להשתמש בו כדי לנהל דרופלטים של DigitalOcean, מאזני עומס, ואפילו רשומות DNS, בנוסף למגוון רחב של שירותים המוצעים על ידי ספקים אחרים. Terraform משתמש בממשק שורת פקודה ויכול לרוץ מהמחשב השולחני שלך או משרת מרוחק.

Terraform פועל על ידי קריאת קבצי תצורה המתארים את הרכיבים המרכיבים את סביבת היישום או המרכז המידע שלך. על סמך התצורה, הוא יוצר תוכנית ביצועים שתארת מה הוא יעשה כדי להגיע למצב הרצוי. לאחר מכן אתה משתמש ב-Terraform כדי לבצע את התוכנית הזו כדי לבנות את התשתית. כאשר שינויים בתצורה מתרחשים, Terraform יכול ליצור ולבצע תוכניות תוספות כדי לעדכן את התשתית הקיימת למצב המתואר כעת.

במדריך זה, תתקין את Terraform ותשתמש בו כדי ליצור תשתית ב-DigitalOcean המורכבת משני שרתי Nginx שמאוזנים בעומס על ידי מאזן עומס של DigitalOcean. לאחר מכן, תשתמש ב-Terraform כדי להוסיף רשומת DNS ב-DigitalOcean שמפנה אל המאזן שלך. זה יעזור לך להתחיל להשתמש ב-Terraform ויתן לך רעיון על כיצד תוכל להשתמש בו כדי לנהל ולהפיץ תשתית שמבוססת על DigitalOcean ועונה על צרכיך האישיים.

הערה: מדריך זה נבדק עם Terraform 1.1.3.

דרישות מוקדמות

כדי להשלים את המדריך הזה, תצטרך:

שלב 1 — התקנת Terraform

Terraform הוא כלי שורת פקודה שאתה מפעיל על המחשב האישי שלך או על שרת רחוק. כדי להתקין אותו, תוריד אותו ותציב אותו ב-PATH שלך כך שתוכל להפעיל אותו בכל תיקייה שאתה עובד בה.

ראשית, הורד את החבילה המתאימה למערכת ההפעלה ולארכיטקטורה שלך מה-עמוד ההורדות הרשמי. אם אתה משתמש ב-macOS או Linux, תוכל להוריד את Terraform באמצעות curl.

ב-macOS, השתמש בפקודה הבאה כדי להוריד את Terraform ולהניח אותו בתיקיית הבית שלך:

  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

לאחר מכן, פתח את 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, שמופעל כאשר נפתחת סביבת shell חדשה. פתח אותו לעריכה על ידי הרצת:

  1. nano ~/.bashrc

הערה: ב-macOS, הוסף את הנתיב לקובץ .bash_profile אם משתמשים ב-Bash, או ל־.zshrc אם משתמשים ב-ZSH.

כדי להוסיף את הנתיב של Terraform ל- PATH שלך, הוסף את השורה הבאה בסופו של הקובץ:

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

שמור וסגור את הקובץ כאשר תסיים.

עכשיו כל ההפעלות של סביבת ה-shell החדשות שלך יכולות למצוא את הפקודה 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 — הגדרת Terraform עבור DigitalOcean

Terraform תומך במגוון של ספקי שירותים דרך ספקים שניתן להתקין. לכל ספק יש מפרטים ייחודיים שבדרך כלל מתאימים ל- API של ספק השירות הרצוי.

הספק DigitalOcean מאפשר ל-Terraform להתקשר עם API של DigitalOcean כדי לבנות את התשתיות. ספק זה תומך ביצירת מגוון משאבי DigitalOcean, כולל:

  • digitalocean_droplet: Droplets (שרתים)
  • digitalocean_loadbalancer: מאזיני משקל
  • digitalocean_domain: רשומות דומיין DNS
  • digitalocean_record: רשומות DNS

טרהפורם תשתמש באסימון הגישה האישי שלך של DigitalOcean כדי לתקשר עם API של 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: ה-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 כדי ליצור Droplet של DigitalOcean ולהתקין תוכנה על ה-Droplet פעם שהוא מתחיל. בשלב זה, תצרו Droplet יחיד של Ubuntu 20.04 ותתקינו את שרת האינג'ינקס באמצעות 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, כולל מרכז הנתונים בו ישהה ואת הסלאג שמזהה את גודל ה-Droplet שאתה רוצה להגדיר. במקרה זה, אתה משתמש ב-s-1vcpu-1gb, שיצור Droplet עם מעבד אחד ו-1GB של זיכרון RAM. (בקר ב-טבלת הסלאגים הזמינים כדי לראות את הסלאגים הזמינים שאתה יכול להשתמש בהם.)

המקטע הזה מציין רשימת מפתחות ציבוריים שברצונך להוסיף ל-Droplet. במקרה זה, אתה מציין את המפתח שהגדרת ב־provider.tf. ודא שהשם כאן תואם לשם שציינת ב־provider.tf.

כאשר אתה מפעיל את Terraform נגד API של DigitalOcean, ייאסף מגוון מידע על ה-Droplet, כגון כתובות ה-IP הציבוריות והפרטיות שלו. מידע זה יכול לשמש על ידי משאבים אחרים בתצורתך.

אם אתה מתעקש על התקנת משאב Droplet, אנא הפנה לתיעוד הרשמי של Terraform: מפרט DigitalOcean Droplet.

כדי להגדיר חיבור ש-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 תנסה לעשות כדי לבנות את התשתיות שתיארת. עליך לציין את הערכים עבור ה-Token שלך ב-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.

השורה + משאב "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 לקריאת קובץ ה-tf של www-1, החלפת כל המופעים של 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 Load Balancer, שתומך בו ספק 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 ]
}

הגדרת מאזין העומס מציינת את שמו, מרכז המידע שבו הוא יהיה, היציאות שבהן ישמיע תעבורה, התצורה לבדיקת הבריאות, וזיהוי כמה שרתים הוא צריך לאחזר, שאתה מביא באמצעות משתני 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. ...

זה אומר שהדרופלטים www-1 ו www-2 כבר קיימים, וטרהפורם ייצור את מאזן המעמד www-lb.

הריצו terraform apply כדי לבנות את מאזן העומס:

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

שוב, טרהפורם יבקש מכם לבדוק את התוכנית. אשרו את התוכנית על ידי הזנת 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 של מאזן העומס שלך:

  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://your_load_balancer_ip בדפדפן שלכם ותראו מסך עצים של Nginx כיוון שמאזן העומס שולח תעבורה אל אחד משני שרתי ה-Nginx.

עכשיו תלמדו איך להגדיר את DNS עבור חשבון DigitalOcean שלכם באמצעות Terraform.

שלב 7 — יצירת תחומי DNS ורשומות

בנוסף ל-Droplets ו-Load Balancers, תוכל ליצור גם דומיין DNS ורשומות דומיין באמצעות Terraform. לדוגמה, אם ברצונך להפנות את הדומיין שלך ל-Load Balancer שלך, תוכל לכתוב את התצורה המתארת את הקשר הזה.

הערה: השתמש בשם דומיין ייחודי שלך, אחרת ל-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 מכיוון שהדומיין מפנה ל-Load Balancer, ששולח תעבורה לאחד משני שרתי ה-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 כדי להגדיר שרתים כחלק מתהליך היצירה שלהם במקום להשתמש בשיטת האספקה שנעשתה במדריך זה.

טרהפורם יש תכונות רבות יותר, ויכול לעבוד עם ספקים אחרים. בדוק את התיעוד הרשמי של טרהפורם כדי ללמוד עוד על איך ניתן להשתמש בטרהפורם כדי לשפר את התשתית שלך.

המדריך הזה הוא חלק מסדרת המדריכים כיצד לנהל תשתיות עם טרהפורם. הסדרה מכסה מספר נושאים של טרהפורם, מהתקנת טרהפורם לראשונה ועד לניהול פרויקטים מורכבים.

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