מודולי Terraform

Mwdwly Terraform



בעולם האספקה ​​והניהול של תשתיות, Terraform התגלתה כבחירה פופולרית בקרב מפתחים וצוותי תפעול. עם התחביר ההצהרתי (HCL – HashiCorp Configuration Language) ותמיכה בספקי תשתית שונים, Terraform מאפשרת שיטות עבודה של תשתית כקוד (IaC).

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







מבוא למודולי Terraform

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



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



ארגון המודול

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





מודול שורש



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

מודול השורש מכיל בדרך כלל את הקובץ 'main.tf' שבו אנו מגדירים את המשאבים והתצורות המהווים את הבסיס לתשתית שלנו. אופציונלי, אנחנו יכולים לקבל את הקבצים 'variables.tf' ו-'outputs.tf' איתו. כמו כן, אנו יכולים להגדיר את ספריית ה'מודולים' שלנו בתוך ספריית השורש כדי לגשת בקלות למודולי הילד.

מודולי ילדים

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

ניתן להשתמש במודולי צאצא בתוך השורש או מודולים צאצאים אחרים המאפשרים הרכבה ובניית תשתית מורכבת. לכל מודול צאצא יש בדרך כלל את הספרייה שלו המכילה את קובצי התצורה הדרושים כגון 'main.tf', 'variables.tf' ו-'outputs.tf'.

כעת, בואו נראה כיצד נוכל ליצור מודול Terraform.

יצירת מודול Terraform

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

בואו ניקח דוגמה קלה של מודול פשוט לאספקת שרת אינטרנט מקומי באמצעות Docker. ראשית, אנו מגדירים את המודול בספריית 'מודולים' בתור 'main.tf'.

מַשׁאָב 'דוקר_מיכל' 'שרת אינטרנט' {
name  = var.name
image = var.image
נמלים {
internal = var.internal_port
חיצוני = var.external_port
}
}

כאן, אנו יוצרים מודול בשם 'docker_container' שלוקח את שם המיכל, תמונת Docker, יציאה פנימית ויציאה חיצונית כמשתני הקלט. המודול מקפל את ההיגיון ליצירת משאב קונטיינר של Docker ומאפשר למתקשר להתאים אישית את מאפייני הקונטיינר.

כפי שהודגם בתמונה הבאה, אנו יוצרים קובץ נפרד בשם 'variables.tf' בספריית 'מודולים' כדי להגדיר את משתני הקלט שניתן להתאים אישית בעת השימוש במודול:

מִשְׁתַנֶה 'שֵׁם' {
תיאור = 'שם מיכל עגינה'
סוּג = מחרוזת
}

מִשְׁתַנֶה 'תמונה' {
תיאור = 'תמונת דוקר'
סוּג = מחרוזת
}

מִשְׁתַנֶה 'כניסה_פנימית' {
תיאור = 'יציאה פנימית בקונטיינר Docker'
סוּג = מספר
}

מִשְׁתַנֶה 'יציאה_חיצונית' {
תיאור = 'יציאה חיצונית למיפוי'
סוּג = מספר
}

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

שימוש במודול Terraform

מכיוון שיצרנו את המודול שלנו, אנו יכולים כעת להשתמש בו בתצורת Terraform הראשית שלנו על ידי הפניה למקור שלו. בואו נעשה את קובץ התצורה הראשי שלנו שהוא 'main.tf' בספריית השורש.

מודול 'שרת_מיכל' {
מָקוֹר = '../modules/docer_container'
שם            = 'שרת האינטרנט שלי'
תמונה           = 'nginx:אחרון'
internal_port   = 80
יציאה חיצונית   = 8080
}

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

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

יציאות מודול

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

תְפוּקָה 'מזהה_מיכל' {
תיאור = 'מזהה של מיכל ה-Docker שנוצר'
value       = docker_container.webserver.id
}

כאן, יצרנו קובץ 'outputs.tf' בתוך ספריית 'מודולים'. משתנה פלט זה חושף את המזהה של קונטיינר Docker שנוצר על ידי המשאב 'docer_container' בשם 'שרת אינטרנט' בתוך המודול.

כעת, אנו יכולים לגשת למזהה המכיל בקובץ תצורת השורש שלנו. עיין בקוד המעודכן הבא של קובץ 'main.tf' בספריית השורש:

מודול 'שרת_מיכל' {
מָקוֹר = '../modules/docer_container'
שם            = 'שרת האינטרנט שלי'
תמונה           = 'nginx:אחרון'
internal_port   = 80
יציאה חיצונית   = 8080
}

מַשׁאָב 'docker_volume' 'נתונים' {
# שאר הטיעונים מגיעים לכאן
לִקְשׁוֹר = module.webserver_container.container_id
}

על ידי שימוש ב-'module.webserver_container.container_id' כערך עבור הארגומנט 'bind', אנו מורים ל-Terraform לאגד את אמצעי האחסון של Docker למיקום שצוין על ידי מזהה המכולה של מודול 'web_container'. זה יוצר קשר בין משאב אמצעי האחסון של Docker לבין המיכל שנוצר על ידי מודול 'webserver_container', ומבטיח שהנפח מותקן במיקום המתאים.

שיטות עבודה מומלצות עבור מודולי Terraform

צור מודולרי לשימוש חוזר

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

מתן שמות ברורים ועקביים

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

לבודד תלות

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

בקרת גרסאות ורישום מודולים

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

סיכום

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