איך לנהל מידע של תשתית בהוצאות Terraform

הקדמה

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

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

דרישות קדם

הערה: ההדרכה נבדקה במיוחד עם Terraform 1.0.2.

הגדרת פלטים

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

מתוך התיקייה terraform-outputs שיצרת כדרישה נחוצה, יצירה ופתיחה את קובץ הdroplets.tf לעריכה:

  1. nano droplets.tf

הוסף את משאב הDroplet והגדרת הפלט הבאים:

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

output "droplet_ip_address" {
  value = digitalocean_droplet.web.ipv4_address
}

אתה ראשית מדגיש משאב שנקרא web. שם המשאב המובהק בענן יהיה test-droplet, באזור fra1, מנהל Ubuntu 20.04.

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

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

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

ניגש yes להיות מיועד ליישם כאשר נבקש. סוף היציאה יהיה דומה לזה:

Output
... digitalocean_droplet.web: Creating... ... digitalocean_droplet.web: Creation complete after 32s [id=207631771] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = ip_address

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

יציאות גם יכולות להיות מוצגות באמצעות הפקודה output:

  1. terraform output

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

Output
droplet_ip_address = ip_address

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

  1. terraform output output_name

עבור droplet_ip_address, היציאה תכל את הכתובת IP בלבד:

Output
ip_address

חוץ מספציפיות הvalue

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

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

פתח droplets.tf עבור עריכה והוסף את השורה המואצית:

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

output "droplet_ip_address" {
  value      = digitalocean_droplet.web.ipv4_address
  sensitive = true
}

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

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

היכנס yes בעת ההתבקשות. תראו שהיצרה מוסווה:

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = <sensitive>

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

בשלב הבא, תיצרו מבנה של דרפלט ויציאה שונה, אז השמדו את הדרפלטים המוגדלים על ידי ביצוע:

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

היצרה בסוף יהיה:

Output
... Destroy complete! Resources: 1 destroyed.

הגדרת דרפלט ויציאה שהציגה את כתובת הIP שלה. עכשיו תלמדו על השימוש ביציאות כדי להציג מבנים מורכבים יותר כמו רשי

ייצור מבנים מורכבים

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

בשימוש בלול ה for

תצטרכו לשנות את ההגדרה של משאב הדפלוט, אז פתחו אותה במחיצה:

  1. nano droplets.tf

ערוך אותה כך:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

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

יישם את הקוד על ידי ריצייה:

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

טרפרפורム יתכנן את יצירת שלושה דפלוטים מספרים, הם נקראים test-droplet-0, test-droplet-1 ו test-droplet-2. בעת ההזמנה, אנכי, כדי לסיים את התהליך. תראו את היציאה הבאה בסוף:

Output
... Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

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

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

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

  1. nano droplets.tf

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

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = {
    for droplet in digitalocean_droplet.web:
    droplet.name => droplet.ipv4_address
  }
}

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

שמור וסגור את הקובץ, ואישום את הפרוייקט שוב:

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

הדבר הבא שאתה יעבור הוא להזין yes כשתועד ותקבל את תוכן הפלט בסוף:

Output
Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = { "test-droplet-0" = "ip_address" "test-droplet-1" = "ip_address" "test-droplet-2" = "ip_address" }

פלט droplet_ip_addresses פרט את כתובות ה-IP של שלושת הדרפלטים המושלמים.

בעזרת הפקט ה output של Terraform, אתה יכול לקבל את תוכן הפלט בעזרת פעולת הפקט הבאה:

  1. terraform output -json droplet_ip_addresses

תוצאת הפעולה תהיה דומה למה שנראה אחרי:

Output
{"test-droplet-0":"ip_address","test-droplet-1":"ip_address","test-droplet-2":"ip_address"}

הפעילות בעזרת הפרינגווינג בעלת תמידיות ותומכת בהרבה מהשפות התכנות. דרך זו, אתה יכול באופן תכנות

שימוש בהבעות המקטע

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

digitalocean_droplet.web[*].ipv4_address

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

ניתן לפתוח droplets.tf עבור עריכה ולשנות את השורות הבאות כדי ליישם את זה:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = digitalocean_droplet.web[*].ipv4_address
}

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

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

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

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = [ "ip_address", "ip_address", "ip_address", ]

על מנת לקבל את התוצאה בפורמט ג 'יוני, ניתן לבצע את הפקודה הבאה:

  1. terraform output -json droplet_ip_addresses

התוצאה תהיה רשימה יחידה:

Output
["ip_address","ip_address","ip_address"]

השתמשת בפלטים יחד עם בעות המקטע ולולאות for כדי לייצא את כתוביות ה-IP של הדרפלטים המופיעים. גם קיבלת את תוכן התוצאה בעלון ג'יוני, ועכשיו תשתמש בכלי jq – כלי לסניף דינמי בסיסים של ג'יוני על פי הבעיות ה

עיבוד היצאות בעזרת jq

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

אם אתם על Ubuntu, תבצעו את הפקודה הבאה כדי להתקעים jq:

  1. sudo snap install jq

על macOS, תוכלו להשתמש ב Homebrew כדי להתקעים את זה:

  1. brew install jq

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

  1. terraform output -json droplet_ip_addresses | jq '.'

בעזרת המשתמש המייצג (.) אומר שהמסמך JSON שנפרש מהקלט צריך ליצוא בלי שינויים:

Output
[ "first_ip_address", "second_ip_address", "third_ip_address" ]

ניתן לבקש רק הכתובת השנייה בעזרת תווספת רשימות, מספרת מאזero:

  1. terraform output -json droplet_ip_addresses | jq '.[1]'

היצאת התוצאות תהיה:

Output
"second_ip_address"

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

  1. terraform output -json droplet_ip_addresses | jq '[.[1]]'

תקבלו רשימה JSON מופיעה יפה:

Output
[ "second_ip_address" ]

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

  1. terraform output -json droplet_ip_addresses | jq '.[0:2]'

היצאת התוצאות תהיה:

Output
[ "first_ip_address", "second_ip_address" ]

הטוורן 0:2 משחזר את האלמנטים הראשונים של הטורנים – החלק העליון של הטוורן (2) אינו כללי, כך שרק אלמנטים במיקום 0 ו1 מוצאים.

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

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

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

סיכום

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

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-infrastructure-data-with-terraform-outputs