כיצד להשתמש ב־Terraform עם צוות שלך

הסופר בחר ב־קרן הקוד הפתוח והחופשי לקבל תרומה כחלק מתוכנית כתיבה בעבור תרומות.

הקדמה

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

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

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

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

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

  • A DigitalOcean Personal Access Token, which you can create via the DigitalOcean Control Panel. You can find instructions in the DigitalOcean product documents, How to Create a Personal Access Token.
  • Terraform מותקן במכשיר המקומי שלך. השלמת שלב 1 של מדריך איך להשתמש ב-Terraform עם DigitalOcean.
  • אם ברצונך להשתמש ב-pg backend, תצטרך מסד נתונים קבוצתי שניתן לגשת אליו שנוצר ונגיש. למידע נוסף, יש לבקר ב-מדריך להתחלה מהירה. ניתן להשתמש במסד נתונים נפרד עבור מדריך זה.
  • אם ברצונך להשתמש בענן המנוהל של Hashicorp, תצטרך חשבון עם Terraform Cloud. ניתן ליצור חשבון ב-דף ההרשמה שלהם.

הערה: ביצענו בדיקות מפורשות של המדריך הזה באמצעות Terraform 1.1.3.

אחסון המצב במסד נתונים מנוהל של PostgreSQL

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

התחל על ידי יצירת ספרייה בשם terraform-team-pg בה תאחסן את הפרויקט:

  1. mkdir ~/terraform-team-pg

נווט אליה:

  1. cd ~/terraform-team-pg

תגדיר תחילה את ספק השירות ותעביר את מחרוזת החיבור למסד הנתונים ולמודול digitalocean. צור ופתח את provider.tf לעריכה:

  1. nano provider.tf

הוסף את השורות הבאות:

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

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

כאן אתה דורש את ספק ה־digitalocean ומגדיר את ה־pg backend, שמקבל מחרוזת חיבור. לאחר מכן, אתה מגדיר את המשתנה do_token ומעביר אותו למופע של ספק digitalocean.

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

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

הפעל את הפרויקט על ידי הרצת:

  1. terraform init

הפלט יהיה דומה לזה:

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. 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! ...

Terraform הצליח לאתחל את הbackend, המשמעות שהוא חובר למסד הנתונים.

בשלב הבא, הגדר את ה-Droplet בקובץ בשם droplets.tf. צור ופתח אותו לעריכה על ידי הרצת:

  1. nano droplets.tf

הוסף את השורות הבאות:

~/terraform-team-pg/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

קוד זה יפעיל Droplet בשם web-1 באזור fra1, הרצת Ubuntu 20.04 על 1GB RAM וליבת מעבד אחת. זו ההגדרה הנדרשת, לכן שמור וסגור את הקובץ.

תצטרך את ה-token שלך של DigitalOcean במשתנה סביבתי. צור אחד, החלף את your_do_token ב-token שלך:

  1. export DO_PAT="your_do_token"

כדי לבדוק שהחיבור למסד הנתונים עובד, נסה לתכנן את התצורה:

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

הפלט יהיה דומה לזה:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web ייצר + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + 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 = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

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

שמירת המצב ב- Terraform Cloud

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

יצירת ארגון

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

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

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

יבקש ממך לבחור את סוג הסביבה העבודה.

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

הקלד שם סביבת עבודה לבחירתך (נקראתו sammy), לאחר מכן לחץ על ליצירת סביבת עבודה כדי לסיים את תהליך יצירת הארגון. כעת יפנך לדף הגדרות סביבת עבודה.

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

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

אז, לחץ על כפתור שמור הגדרות כדי לשמור את השינויים.

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

התיאור המוגדר כברירת מחדל הוא בסדר, אז לחץ על צור אסימון API כדי ליצור אותו.

לחץ על ערך האסימון, או על האייקון אחריו, כדי להעתיק את האסימון API. תשתמש באסימון זה כדי להתחבר את הפרויקט שלך לחשבון ה- Terraform Cloud שלך.

בשורת הפקודה, הפעל את הפקודה הבאה כדי להתחבר:

  1. terraform login

תקבל את הפלט הבא:

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

טרהפורם מזהיר אותך כי האסימון יאוחסן מקומית. הזן yes כאשר הוא מבקש:

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

הדבק את האסימון שהעתקת ואשר אותו עם ENTER. טרהפורם תציג הודעת הצלחה:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

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

הגדרת הפרויקט

ראשית, צור ספרייה בשם terraform-team-cloud שם תאחסן את הפרויקט:

  1. mkdir ~/terraform-team-cloud

נווט אליה:

  1. cd ~/terraform-team-cloud

כדי להגדיר את הפרויקט שלך, תצטרך ל־:

  • להגדיר ולהגדיר את ספק ה־cloud, אשר מתממש עם Terraform Cloud.
  • לדרוש מספק ה־digitalocean כדי להיות מסוגל להפעיל משאבי DigitalOcean.
  • להגדיר ולאתחל משתנים שתשתמש בהם.

תאחסן את תצורת דרישות הספק והמודול בקובץ בשם provider.tf. צור ופתח אותו לעריכה על ידי הרצת:

  1. nano provider.tf

הוסף את השורות הבאות:

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

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

כאן, תציין ראשית את גרסת ה־Terraform שלך. לאחר מכן, תציין את ספק ה־digitalocean כפי שנדרש ותגדיר את ה־backend ל־cloud. עבור ה־organization וה־workspaces.name, החלף את הערכים שמודגשים בשמות שציינת.

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

אתחל את הפרויקט שלך באמצעות הפקודה הבאה:

  1. terraform init

הפלט יהיה דומה לזה:

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.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 Cloud has been successfully initialized! ...

מכיוון שההגדרה של ה-Droplet זהה לפרויקט הקודם, תוכל להעתיק אותה על ידי הרצת:

  1. cp ../terraform-team-pg/droplets.tf .

סופסוף, תגדיר את ערכי המשתנים. ספק ה-cloud לא תומך במעבר ערכים למשתנים דרך שורת הפקודה, לכן תצטרך להעביר אותם באמצעות קבצי משתנים או להגדיר אותם ב-Terraform Cloud. Terraform קורא ערכי משתנים מקבצים ששמם מסתיים ב-.auto.tfvars. צור ופתח קובץ בשם vars.auto.tfvars לעריכה, בו תגדיר את המשתנה do_token:

  1. nano vars.auto.tfvars

הוסף את השורה הבאה, והחליף את your_do_token באקראי ה-API של DigitalOcean שלך:

vars.auto.tfvars
do_token = "your_do_token"

כאשר סיימת, שמור וסגור את הקובץ. Terraform תקרא אוטומטית את הקובץ הזה בעת תכנון פעולות.

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

יישום ההגדרה

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

תיישם את הפרויקט על ידי הרצת הפקודה הבאה לעדכון:

  1. terraform apply

תשימו לב שהפלט שונה כאשר אתה משתמש ב־local כמנוע הגבה:

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web ייווצר + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + 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 = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

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

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

באפשרותך כעת להשמיד את המשאבים שהוטמעו על ידי הרצת הפקודה הבאה:

  1. terraform destroy

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

מסקנה

במדריך זה, השתמשת בשני מנועי גבה שונים: Terraform Cloud, שהוא הצעה לניהול עננים של Hashicorp עבור Terraform; ו־pg, שמאפשר לך לאחסן את מצב הפרויקט במסד נתונים של PostgreSQL. השתמשת במסד נתונים מנוהל מאתר DigitalOcean, שבאפשרותך להגדיר ולהשתמש בו עם Terraform בתוך דקות.

למידע נוסף על תכונות של Terraform Cloud, בקרו ב-מסמכים רשמיים.

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team