איך להפליג מספר סביבות בפרוייקט ה-Terraform שלך בלי לשכפל קוד

המחבר בחר את הקרן החינמית והפתוחה כדי לקבל תרמית בתוכנית Write for DOnations.

מביא

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

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

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

דרישות קדם

כדי להשלים את ההדרכה, תזדקקו ל:

  • מס 'גישה פרטית' ב DigitalOcean, שניתן ליצור דרך הלוח בקרת ה DigitalOcean. אתם יכולים למצוא הוראות במסמכים המוצעים על המוצר הבאים איך ליצור מס 'גישה פרטית'.
  • טרפורפ מו Installed על המכונה המקומית שלכם ופרוייקט מוגדר עם ספקtor ה DigitalOcean. סיימו שלב 1 ו שלב 2 מההדרכה איך להשתמש בטרפורפ עם DigitalOcean, והסיב למעשה בשם התיקייה של הפרוייקט terraform-advanced, במקום loadbalance. בזמן שלב 2, אל תכניסו את המשתנה pvt_key ומשאב המפתח SSH.

הערה: ההדרכה הזו בודקה בדיוק עם טרפורפ 1.0.2.

הגדלת מספר מקטעים משאבים באמצעות סדנאות

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

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

אזל ישראל, יש להשתמש בתחילית הטקסט המקורי ולתרגם אותו לעברית:

אין למען שחללי העבודה לא עוקבים אחר הקוד האמיתי, יש לנהל את ההפרדה בין קודים של חללי עבודה מרובים ברמת בקרת הגירסא (VCS) על ידי התאמתם לגרסאות תשתיתיהם. כיצד תוכל להשיג זאת תלוי בכלי VCS עצמו; לדוגמה, ב־Git branches יהיה חילוף מתאים. כדי להקל על הניהול של הקוד עבור סביבות מרובות, תוכל לחלק אותם ל־מודולים רהיטים, כדי להימנע מחזרה של קוד דומה עבור כל סביבה.

הפלטת משאבים בחללי עבודה

עכשיו תיצור פרוייקט שיִפְלַט דרופלט, אותו תיישם מחללי עבודה מרובים.

תאחסן את ההגדרה של הדרופלט בקובץ שנקרא droplets.tf.

בהנחת שאתה נמצא בתיקיית terraform-advanced, יצירו ופתחו אותו לעריכה על ידי הרצת:

  1. nano droplets.tf

הוסיפו את השורות הבאות:

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-18-04-x64"
  name   = "web-${terraform.workspace}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

ההגדרה הזו תיצור דרופלט שייריץ אובונטו 18.04 עם קור ראשון ו1 ג״ב זכרון באיזור fra1. השם שלו יכיל את השם של החלל העבודה הנוכחי ממנו הוא מופלט. כאשר תסיימו, שמרו וסגרו את הקובץ.

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

  1. terraform apply -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) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-default" + 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. ...

הנה בקשה להגיע לגיבוי הדופלוט בעבודת המרחב default.

שם הדופלוט יהיה web-default, בגלל שהמרחב שאתה מתחיל בו נקרא default. אתה יכול לרשום את המרחבים כדי לוודא שהוא היחיד הזמין:

  1. terraform workspace list

התוצאה תרצה דומה לזו:

Output
* default

האסטריסקופ (*) אומר שאתה כרגע מוכן את המרחב הזה.

יוצר ומעבר למרחב חדש בשם testing, שאתה יהיה משתמש בו כדי לגיבות דופלוט שונה, על ידי הרצת workspace new:

  1. terraform workspace new testing

התוצאה תרצה דומה לזו:

Output
Created and switched to workspace "testing"! You're now on a new, empty workspace. Workspaces isolate their state, so if you run "terraform plan" Terraform will not see any existing state for this configuration.

אתה מתכוון ליישם את הגיבוי של הדופלוט בצורה נוספת על ידי הרצת:

  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) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-testing" + 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. ...

שימו לב שטררפורם מתכוון לגיבות דופלוט בשם web-testing, שהוא קרא אותו שונה מweb-default. זה בגלל שהמרחבים default וtesting משאירים במרחבם סטטוסים נפרדים ואין להם ידע על משאביהם אחד על השני—אפילו שהם צאצאים מאותו קוד.

על מנת לוודא שאתה במרחב testing, הוצא את שם המרחב הנוכחי שלך על ידי הרצת workspace show:

  1. terraform workspace show

התוצאה תהיה שם המרחב הנוכחי:

Output
testing

למחיקת מרחב עבודה, עליך ראשית להרוס את כל המשאבים שהופרשו בה. אחר כך, אם הוא פעיל, עליך להחליף לאחר באמצעות workspace select. מכיוון שהמרחב העבודה testing כאן ריק, יכול להחליף לdefault מיד:

  1. terraform workspace select default

תקבל פלט של Terraform שאישר את ההחלפה:

Output
Switched to workspace "default".

אז תוכל למחוק אותו על ידי הרצת workspace delete:

  1. terraform workspace delete testing

Terraform יבצע אז את המחיקה:

Output
Deleted workspace "testing"!

תוכל להרוס את הדרופלט שהפרשת במרחב העבודה default על ידי הרצת:

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

הזן yes כאשר יבקש ממך לסיים את התהליך.

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

הפרישת משאבים בעלי עצמה

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

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

נפחים סופקים מקום אחסון إضافי. הם יכולים להיות מוצמדים לדימותים (שרתים), אך הם נפרדים מהם. בשלב זה, תגדיר את הנפח ותחבר אותו לדימות בקובץ droplets.tf.

פתח אותו לעריכה:

  1. nano droplets.tf

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

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-18-04-x64"
  name   = "web-${terraform.workspace}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

resource "digitalocean_volume" "volume" {
  region                  = "fra1"
  name                    = "new-volume"
  size                    = 10
  initial_filesystem_type = "ext4"
  description             = "New Volume for Droplet"
}

resource "digitalocean_volume_attachment" "volume_attachment" {
  droplet_id = digitalocean_droplet.web.id
  volume_id  = digitalocean_volume.volume.id
}

כאן אתה מגדיר שני משאבים חדשים, הנפח עצמו והצירוף הנפח. הנפח יהיה בגודל 10GB, מקובע כ- ext4, נקרא new-volume, וממוקם באותה אזור כמו הדימות. מכיוון שהנפח והדימות הם ישויות נפרדות, יהיה עליך להגדיר אובייקט צירוף נפח כדי לחבר אותם. volume_attachment לוקח את מספרי הדימות והנפח ומורה לענן DigitalOcean להפוך את הנפח זמין לדימות כהתקן דיסק.

ברגע שהשגת את זה, שמור וסגור את הקובץ.

תכנן את התצורה הזו על ידי הרצת:

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

הפעולות שתרצה לתכנן 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.web ייצר + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-default" + 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) } # digitalocean_volume.volume ייצר + resource "digitalocean_volume" "volume" { + description = "New Volume for Droplet" + droplet_ids = (known after apply) + filesystem_label = (known after apply) + filesystem_type = (known after apply) + id = (known after apply) + initial_filesystem_type = "ext4" + name = "new-volume" + region = "fra1" + size = 10 + urn = (known after apply) } # digitalocean_volume_attachment.volume_attachment ייצר + resource "digitalocean_volume_attachment" "volume_attachment" { + droplet_id = (known after apply) + id = (known after apply) + volume_id = (known after apply) } Plan: 3 to add, 0 to change, 0 to destroy. ...

הפרטים הפלט הם שTerraform ייצור דימות, נפח, וצירוף נפח, שמחבר את הנפח לדימות.

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

הפניית למודולים מוכנים מראש

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

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

עכשיו תוסיף את מודול מפתח SSH של DigitalOcean לפרוייקט שלך. תאחסן את הקוד בנפרד מההגדרות הקיימות בקובץ שנקרא ssh-key.tf. יצירתו ופתיחתו לעריכה על ידי הרצת:

  1. nano ssh-key.tf

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

module "ssh-key" {
  source         = "clouddrove/ssh-key/digitalocean"
  key_path       = "~/.ssh/id_rsa.pub"
  key_name       = "new-ssh-key"
  enable_ssh_key = true
}

זהו קוד שמגדיר מקבצת clouddrove/droplet/digitalocean מהרשימה ומציב חלק מהפרמטרים שהיא מציעה. הוא צריך להוסיף מפתח SSH ציבורי לחשבון שלך על ידי קריאתו מ ~/.ssh/id_rsa.pub.

ברגע שתסיימו, שמו וסגיר את הקובץ.

לפני שתתכנן את הקוד הזה, עליך להוריד את המודול המצורף על ידי ריציית:

  1. terraform init

תקבל יוצאת דומה לדוגמה הבאה:

Output
Initializing modules... Downloading clouddrove/ssh-key/digitalocean 0.13.0 for ssh-key... - ssh-key in .terraform/modules/ssh-key Initializing the backend... Initializing provider plugins... - Reusing previous version of digitalocean/digitalocean from the dependency lock file - Using previously-installed digitalocean/digitalocean v2.10.1 Terraform has been successfully initialized! ...

עכשיו תוכל לתכנן את הקוד לשינויים:

  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: ... # module.ssh-key.digitalocean_ssh_key.default[0] ייצרה + resource "digitalocean_ssh_key" "default" { + fingerprint = (known after apply) + id = (known after apply) + name = "devops" + public_key = "ssh-rsa ... demo@clouddrove" } Plan: 4 to add, 0 to change, 0 to destroy. ...

היוצאה מראה שאתה ייצר משאב מפתח SSH, מה שאומר שאתה הוריד והופעל את המודול מהקוד שלך.

סיכוי

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-deploy-multiple-environments-with-workspaces-in-your-terraform-project