איך למעט ארכיטקטורת פרוייקט Terraform

קורס הקדמה

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

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

תנאי קבע

הערה: המדריך הזה נבדק באופן ספציפי עם Terraform 1.0.2.

הבנה של מבנה הפרוייקט ב Terraform

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

מי היתרוץ המשפחה? מה אתם מצריכים למיסורת קוד הינוfrastructure ומה בין המדריך לבחירה את המדריך המוفضל. גם אתם מודיעים את מה שמחשבת טרראפלין כמה מחשבת מדינה.מי היתרוץ המידריך המופضל בטרראפלין הוא מידריך מחשבת מדינה מונח מידריך המחשבת המופضל של טרראפלין. מי היתרוץ המשפחה? מה אתם מצריכים למיסורת קוד הינוfrastructure ומה בין המדריך לבחירה את המדריך המוفضל. גם אתם מודיעים את מה שמחשבת טרראפלין כמה מחשבת מדינה.

מי היתרוץ המשפחה? מה אתם מצריכים למיסורת קוד הינוfrastructure ומה בין המדריך לבחירה את המדריך המוفضל. גם אתם מודיעים את מה שמחשבת טרראפלין כמה מחשבת מדינה.

מי היתרוץ המשפחה? מה אתם מצריכים למיסורת קוד הינוfrastructure ומה בין המדריך לבחירה את המדריך המוفضל. גם אתם מודיעים את מה שמחשבת טרראפלין כמה מחשבת מדינה.מי היתרוץ המשפחה? מה אתם מצריכים למיסורת קוד הינוfrastructure ומה בין המדריך לבחירה את המדריך המוفضל. גם אתם מודיעים את מה שמחשבת

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

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

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

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

מבנה פשוט

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

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

.
└── tf/
    ├── versions.tf
    ├── variables.tf
    ├── provider.tf
    ├── droplets.tf
    ├── dns.tf
    ├── data-sources.tf
    └── external/
        └── name-generator.py

בגלל שהפרוייקט הזה ישדר שרת אפאלי אנג' פיס ותיעד רשימות DNS, ההגדרות של המשתנים של הפרוייקט, ספק טרפורמ של DigitalOcean, הדרפלוט והרשימות DNS, יישמו בקבצים המיועדים להם. הגידולים המינימליים של Terraform וספק טרפורמ של DigitalOcean ייצגו בקטע versions.tf, בעוד הסקripט הפיוני שייצר שם לדרפלוט (וישמש כמשאב דינמי ב data-sources.tf) יישמו בתיקייה external, כדי להפריד אותו מקוד הלוגי.

מבנה מורכב

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

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

.
└── tf/
    ├── modules/
    │   ├── network/
    │   │   ├── main.tf
    │   │   ├── dns.tf
    │   │   ├── outputs.tf
    │   │   └── variables.tf
    │   └── spaces/
    │       ├── main.tf
    │       ├── outputs.tf
    │       └── variables.tf
    └── applications/
        ├── backend-app/
        │   ├── env/
        │   │   ├── dev.tfvars
        │   │   ├── staging.tfvars
        │   │   ├── qa.tfvars
        │   │   └── production.tfvars
        │   └── main.tf
        └── frontend-app/
            ├── env/
            │   ├── dev.tfvars
            │   ├── staging.tfvars
            │   ├── qa.tfvars
            │   └── production.tfvars
            └── main.tf

הגישה הזו נובעת במהלך סדרת איך לנהל תשתית בעזרת Terraform.

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

שלב 1 — הגדרת הפרוייקט המקורי שלך

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

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

  1. mkdir ~/apache-droplet-terraform

עבורכם לנווט אליו:

  1. cd ~/apache-droplet-terraform

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

יצירו קבצים בשם versions.tf ופתחו אותו לעריכה על ידי הבצע הבא:

  1. nano versions.tf

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

~/apache-droplet-terraform/versions.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

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

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

  1. nano variables.tf

הוסף את המשתנים הבאים:

~/apache-droplet-terraform/variables.tf
variable "do_token" {}
variable "domain_name" {}

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

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

בשלב הבא, נגדיר את המערכת הספקת ה DigitalOcean עבור הפרוייקט הזה. אתם תשמורו עליה בקובץ שנקרא provider.tf. בואו ופתחו אותו עבור עריכת על-ידי:

  1. nano provider.tf

הוסף את הספקת המערכת:

~/apache-droplet-terraform/provider.tf
provider "digitalocean" {
  token = var.do_token
}

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

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

שלב 2 — יצירת סקript פיוני ב Python עבור מידע דינמי

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

תשמורו את הסקript בקובץ בשם name-generator.py, בתוך הירח בשם external. קודם כל, יצירו את הירח על ידי הרצת:

  1. mkdir external

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

יצירו name-generator.py בתוך external ופתחו אותו לעריכה:

  1. nano external/name-generator.py

הוסף את הקוד הבא:

external/name-generator.py
import json, time

fixed_name = "web"
result = {
  "name": f"{fixed_name}-{int(time.time())}",
}

print(json.dumps(result))

סקript הפיתוח הזה מיובא את המודלים json ו time, ומדגיש דיקסקריביות שנקראת result, ומגדירה את ערך המפתח name למשהו שמשולב את השם הקביע fixed_name עם הזמן UNIX המקורי של המכונה בה הוא מופעל. אחר כך, result מופרש לJSON ויוצא על stdout. היוצאה תשנה כל פעם שסקript זה יורה:

Output
{"name": "web-1597747959"}

will be translated as:

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

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

למידע נוסף על מה שTerraform מצפה, ביקרו ב־התיעוד הרשמי על מקורות הנתונים.

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

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

  1. nano data-sources.tf

הוסיפו את ההגדרה הבאה:

~/apache-droplet-terraform/data-sources.tf
data "external" "droplet_name" {
  program = ["python3", "${path.module}/external/name-generator.py"]
}

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

מקור הנתונים הזה נקרא droplet_name ומפעיל את התסריט name-generator.py באמצעות Python 3, שנמצא בתוך התיקייה external שזה עתה יצרתם. הוא מנתח אוטומטית את הפלט ומספק את הנתונים המנותחים תחת התכונה result שלו לשימוש בהגדרות משאבים אחרים.

עכשיו כשמקור הנ

שלב 3 — הגדרת הדיפלוט

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

יצירה ופתיחת הקובץ droplets.tf עבור עריכה:

  1. nano droplets.tf

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

~/apache-droplet-terraform/droplets.tf
data "digitalocean_ssh_key" "ssh_key" {
  name = "your_ssh_key_name"
}

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = data.external.droplet_name.result.name
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.ssh_key.id
  ]
}

תרשים קודם משאב מפתח של מפתח SSH בשם ssh_key, שירשם מפתח מחשבה בשם שמו. והבה לא לשכוח להחליף את הקוד המדגים בשם של מפתח הSSH שלך.

אחר כך, תרשים משאב דיפלוט בשם web. שמו האמיתי בעזרת הענן ישנה, בגלל שהוא בעצם מבקש ממקור מידע חיצוני droplet_name. כדי להתחיל את הדיפלוט עם מפתח SSH בכל פעם שהוא מושלם, מעבר את התעודה של ssh_key למשתנה ssh_keys, כך שDigitalOcean ידעה איזה מפתח ליישם.

עכשיו, זה כל מה שצריך להגדיר בקשר ל droplet.tf, אז שימו את הקובץ וסגור אותו כשתסיים.

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

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

משלה 4 – מוצרת קודמים

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

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

  1. nano dns.tf

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

~/apache-droplet-terraform/dns.tf
resource "digitalocean_record" "www" {
  domain = var.domain_name
  type   = "A"
  name   = "@"
  value  = digitalocean_droplet.web.ipv4_address
}

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

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

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

מוצרת 5 — מחלקת ואפליקציה המצורת<diy

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

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

  1. terraform init

תקבל את התוצאה הבאה:

Output
Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Finding latest version of hashicorp/external... - Installing digitalocean/digitalocean v2.10.1... - Installed digitalocean/digitalocean v2.10.1 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) - Installing hashicorp/external v2.1.0... - Installed hashicorp/external v2.1.0 (signed by HashiCorp) 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.

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

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

  1. export DO_PAT="your_do_api_token"
  2. export DO_DOMAIN_NAME="your_domain"

את הטוקן ה API שלך ניתן למציא בפנל הבקרן שלך ב DigitalOcean.

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

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

תקבל תוצאה דומה לבאן:

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-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-1625908814" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + 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) } # digitalocean_record.www ייצור + resource "digitalocean_record" "www" { + domain = "your_domain'" + fqdn = (known after apply) + id = (known after apply) + name = "@" + ttl = (known after apply) + type = "A" + value = (known after apply) } Plan: 2 to add, 0 to change, 0 to destroy. ...

השורות המתחילות בצבע ירוק ה + מרמזות שTerraform ייצור את כל המשאבים הבאים—שזה בדיוק מה שצריך לקרות, אז תוכל ליישם את ההגדרה:

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

תקבל את אותו התוצאה שלפני, אבל הפעם תובע את האשר:

Output
Plan: 2 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, וTerra

Output
digitalocean_droplet.web: Creating... ... digitalocean_droplet.web: Creation complete after 33s [id=204432105] digitalocean_record.www: Creating... digitalocean_record.www: Creation complete after 1s [id=110657456] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

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

  1. terraform show | grep "ipv4"

תקבל את כתובת הIP של הדרופלט שלך:

Output
ipv4_address = "your_Droplet_IP" ...

ניתן לבדוק את הרשומות A פומביות על ידי הרצת:

  1. nslookup -type=a your_domain | grep "Address" | tail -1

הפלט יראה את הכתובת IP אליה הרשומה A מכוונת:

Output
Address: your_Droplet_IP

הן זהות, כפי שצריך להיות, משמע שהדרופלט והרשומה DNS הופקו בהצלחה.

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

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

כאשר ישתקשר לך, הקלד yes כדי להמשיך.

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

שלב 6 — הפעלת קוד באמצעות מפרשים

עכשיו תגדיר את ההתקנה של שרת האינטרנט Apache על הדרופלט המופץ שלך על ידי שימוש במפרש remote-exec כדי לבצע פקודות מותאמות.

הספקים של Terraform יכולים לשמש לביצוע פעולות ספציפיות על משאבים מרוחקים שנוצרו (באמצעות הספק remote-exec) או על המכונה המحلאית בה הקוד מתבצע (באמצעות הספק local-exec). אם הספק נכשל, הצומת יימרך כמזוהם במצב הנוכחי, מה שאומר שהוא יימחק וינוצר מחדש בפעם הבאה.

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

  1. nano variables.tf

הוסף את השורה המודגשת:

~/apache-droplet-terraform/variables.tf
variable "do_token" {}
variable "domain_name" {}
variable "private_key" {}

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

הלאה, תוסיף את נתוני החיבור וההצהרות של הספקים המרוחקים לתצורת הדרופל שלך. פתח droplets.tf לעריכה על ידי הפעלה:

  1. nano droplets.tf

הרחב את הקוד הקיים עם השורות המודגשות:

~/apache-droplet-terraform/droplets.tf
data "digitalocean_ssh_key" "ssh_key" {
  name = "your_ssh_key_name"
}

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = data.external.droplet_name.result.name
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.ssh_key.id
  ]

  connection {
    host        = self.ipv4_address
    user        = "root"
    type        = "ssh"
    private_key = file(var.private_key)
    timeout     = "2m"
  }

  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # התקנת Apache
      "apt update",
      "apt -y install apache2"
    ]
  }
}

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

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

  1. export DO_PRIVATE_KEY="private_key_location"

הערה: המפתח הפרטי, וכל קובץ אחר שתרצו להעלות מתוך Terraform, חייבים להיות מונחים בתוך הפרוייקט. אתם יכולים לראות את המדריך איך להגדיר את המפתח SSH על שרת Linux עבור מידע נוסף בנוגע להגדרת מפתח SSH על Ubuntu 20.04 או דיסטRIBUTIONS אחרות.

נסו ליישם את ההגדרה שוב:

  1. terraform apply -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

מייצרים yes כשניתנת ההזמנה. תקבלו יוצאה דומה לקודם, אך בהתבסס על יוצאה ארוכה מהמארח remote-exec:

Output
digitalocean_droplet.web: Creating... digitalocean_droplet.web: Still creating... [10s elapsed] digitalocean_droplet.web: Still creating... [20s elapsed] digitalocean_droplet.web: Still creating... [30s elapsed] digitalocean_droplet.web: Provisioning with 'remote-exec'... digitalocean_droplet.web (remote-exec): Connecting to remote host via SSH... digitalocean_droplet.web (remote-exec): Host: ... digitalocean_droplet.web (remote-exec): User: root digitalocean_droplet.web (remote-exec): Password: false digitalocean_droplet.web (remote-exec): Private key: true digitalocean_droplet.web (remote-exec): Certificate: false digitalocean_droplet.web (remote-exec): SSH Agent: false digitalocean_droplet.web (remote-exec): Checking Host Key: false digitalocean_droplet.web (remote-exec): Connected! ... digitalocean_droplet.web: Creation complete after 1m5s [id=204442200] digitalocean_record.www: Creating... digitalocean_record.www: Creation complete after 1s [id=110666268] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

עכשיו תוכלו לנווט לאתר המקומי שלכם בדפדפן אינטרנטי. תראו את דף הקבלה המקביל לApache.

זה אומר שApache הותקן בהצלחה, ושTerraform מארח הכל בצורה נכונה.

כדי להוציא את המשאבים המושלמים שנשלטים, יש לבצע את הפקודה הבאה ולהזין yes כשניתנת ההזמנה:

  1. terraform destroy -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

עכשיו סיימתם פרוייקט קטן של Terraform עם מבנה פשוט שמשדר את השרת האינטרנטי Apache על דופלט ומקבל רשימות DNS עבור המיון המעדפה.

סיכום

אתה למד על שני גישות כלליות למבנה הפרוייקטים שלך בטררהפורם, בהתאם לתחום המורכבות שלהם. אחרי שהשתמשת בגישה הפשוטה למבנה ובמארח הפעולות remote-exec כדי לבצע פעולות, השתמשת בהצגת דרפלט שמנוהל אפאליפה עם רשומים DNS עבור החשמלים שלך.

למשלוח, הנה מבנה הקבצים של הפרוייקט שיצרת במסלול הלקוח:

.
└── tf/
    ├── versions.tf
    ├── variables.tf
    ├── provider.tf
    ├── droplets.tf
    ├── dns.tf
    ├── data-sources.tf
    └── external/
        └── name-generator.py

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

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-structure-a-terraform-project