בניית מכונת וירטואל ב-Windows Azure עם Terraform: שלב אחר שלב

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

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

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

דרישות קדם-נדרשות

אם ברצונך להמשיך עם ההדרכה הזו, וודא שיש לך את הדברים הבאים:

בזמן השלבים, הדרכה זו תשתמש ב-macOS עם PowerShell Core, אף שהתהליך יכול להתבצע ב-Windows 10 עם PowerShell Core, Windows PowerShell או אפילו בפקודת ה-Windows.

התקנת Terraform

להתחיל, תצטרך ראשית להוריד את Terraform. ישנם הרבה דרכים לעשות זאת תלוי בהעדפתך. המדריך הזה משתמש ב-macOS ולכן תוכל להשתמש ב-HomeBrew על ידי הרצת brew install terraform. תוכל גם לעבור ישירות לדף ההורדה של טרהפורם או, אם אתה בווינדוס, תוכל להשתמש ב-Chocolatey גם כן.

הידעת ש-Azure Cloud Shell מגיעה עם טרהפורם מותקנת מראש?

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

Terraform Usage Instructions

אימות ל-Azure

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

יצירת סוכן שירות

בקונסולת שלך, צור סוכן שירות באמצעות Azure CLI. כדי לעשות זאת:

ראשית, יש למצוא את מזהה המינוי שלך באמצעות הפקודה az account list למטה.

> az account list --query [*].[name,id]

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

$subscriptionId = 'xxxx-xxxxx-xxxxx'
$sp = az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/$subscriptionId" -n TerraformTesting | ConvertFrom-Json

CLI של Azure יתקשר עם Azure ויצור אפליקציית Azure AD עם סיסמה כפי שמוצג למטה. מכיוון שאתה מקצה את הפלט שמוצג למעלה למשתנה $sp, יש לך את appId ואת password מאוחסנים במשתנה לשימוש מאוחר יותר.

Azure ID Application with a Password

הגדרת משתנים סביבתיים

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

  • מזהה המינוי של Azure
  • המזהה של אפליקציית Azure AD של סוכן השירות
  • סיסמת סוכן השירות
  • נותן השירות של Azure AD

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

מאחר שפלט הפקודה az ad sp create-for-rbac נשמר למשתנה $sp מראש, ניתן פשוט להפנות למאפיינים במקום להעתיק ולהדביק אותם.

$env:ARM_SUBSCRIPTION_ID = $subscriptionId
$env:ARM_CLIENT_ID = $sp.appId
$env:ARM_CLIENT_SECRET = $sp.password
$env:ARM_TENANT_ID = $sp.tenant

לאחר שהגדרת משתני הסביבה, Terraform מוכן להתחבר ל-Azure!

צור קובץ הגדרה

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

בקונסולת ה־PowerShell שלך, צור תיקייה בשם TerraformTesting בכל מקום שתרצה ולאחר מכן החליף אל התיקייה ההיא.

mkdir TerraformTesting
cd TerraformTesting

לאחר מכן, צור את קובץ התצורה main.tf. זהו המקום שבו יאוחסן קובץ התצורה לבניית ה־Azure VM עם Terraform. זהו הקובץ המפורסם ביותר שנקרא "ראשי". הוא מכיל הכרזות ספק ומשאבים לכל האינפרהסטרקטורה שבה תנהל התצורה.

אם ברצונך ללמוד עוד על התחביר (HCL), מייקל לוואן ואני יש לנו פרק מצוין על Terraform בספר האלקטרוני שלנו No BS Azure and DevOps eBook.

צור קובץ חדש main.tf בתוך התיקייה Terraformtesting שנראה כך למטה.

## <https://www.terraform.io/docs/providers/azurerm/index.html>
provider "azurerm" {
  version = "=2.5.0"
  features {}
}

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
resource "azurerm_resource_group" "rg" {
  name     = "TerraformTesting"
  location = "eastus"
}

## <https://www.terraform.io/docs/providers/azurerm/r/availability_set.html>
resource "azurerm_availability_set" "DemoAset" {
  name                = "example-aset"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
resource "azurerm_virtual_network" "vnet" {
  name                = "vNet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/subnet.html> 
resource "azurerm_subnet" "subnet" {
  name                 = "internal"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefix       = "10.0.2.0/24"
}

## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
resource "azurerm_network_interface" "example" {
  name                = "example-nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
resource "azurerm_windows_virtual_machine" "example" {
  name                = "example-machine"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_F2"
  admin_username      = "adminuser"
  admin_password      = "P@$$w0rd1234!"
  availability_set_id = azurerm_availability_set.DemoAset.id
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2016-Datacenter"
    version   = "latest"
  }
}

אתחל את Terraform

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

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

Downloading the azurerm

אמת את התצורה

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

ודאו שתתקנו את כל השגיאות שהפקודה terraform plan גילתה לפני שתנסו להפעיל באמת את התשתית!

בניית ה-VM ב-Azure עם Terraform

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

Buildign Azure VM

אם אתם רואים את הטקסט המבריק והמבריק, הירוק Apply complete! בתחתית, זאת אומרת שטרהפורם בנה את המשאבים בהצלחה!

ניקוי

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

יצרתם אישור שירות עבור טרהפורם כדי לאמת ל-Azure. אתם יכולים להסיר את זה עם הפקודה az ad sp delete למטה.

$spId = ((az ad sp list --all | ConvertFrom-Json) | Where-Object { '<http://TerraformTesting>' -in $_.serviceprincipalnames }).objectId
az ad sp delete --id $spId

בנוסף, הסירו את ה-VM שיצרתם וכל המשאבים האחרים בקובץ התצורה באמצעות terraform destroy. אם ברצונכם לאמת את התצורה ולבדוק מה יקרה אם תריצו terraform destroy, תוכלו גם להריץ terraform plan -destroy.

סיכום

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

Terraform הוא כלי תעשייתי פופולרי כעת עם תמיכה מקהילה נרחבת והמון אנשים שיכולים לעזור!

Source:
https://adamtheautomator.com/terraform-azure-vm/