قم ببناء جهاز افتراضي في ويندوز أزور باستخدام تيرافورم: خطوة بخطوة

هل قمت بإنشاء Azure VM عبر بوابة Azure من قبل؟ إذا كان الأمر كذلك، فكم عدد النقرات التي استغرقتها للقيام بذلك؟ هل يمكنك القيام بذلك مرارًا وتكرارًا، وتوفير نفس القيم الدخلية بالضبط للتأكد من أنك تلبي معيارًا محددًا؟ ربما لا. تحتاج إلى أتمتة العملية. قم بإنشاء Azure VM باستخدام Terraform!

Terraform هو برنامج من قبل شركة Hashicorp يقوم بإنشاء بنية تحتية بسيطة أو معقدة على الأرض أو في السحابة. Terraform عبارة عن ملف ثنائي واحد يقرأ ملفات التكوين وينشئ حالة ثم يضمن أن تكوين البنية التحتية الخاصة بك تتم وتظل في تلك الحالة.

في هذه المقالة، ستتعلم كيفية البدء في استخدام Terraform من خلال إنشاء Azure VM. سيكون هذا البرنامج التعليمي مثالًا رائعًا لاستخدام Terraform في Azure.

المتطلبات الأساسية

إذا كنت ترغب في متابعة هذا البرنامج التعليمي، تأكد من وجود ما يلي:

  • Azure CLI موثقة بالفعل في اشتراك Azure

خلال الخطوات، سيتم استخدام macOS مع PowerShell Core، ولكن يمكن اتباع نفس العملية على Windows 10 باستخدام PowerShell Core أو Windows PowerShell أو حتى موجه الأوامر في Windows.

تثبيت Terraform

للبدء، ستحتاج أولاً إلى تنزيل Terraform. هناك العديد من الطرق لفعل ذلك اعتمادًا على تفضيلك. يستخدم هذا البرنامج التعليمي macOS لذا يمكنك استخدام HomeBrew عن طريق تشغيل brew install terraform. يمكنك أيضًا الانتقال مباشرة إلى صفحة تنزيل Terraform أو، إذا كنت تستخدم نظام Windows، يمكنك أيضًا استخدام Chocolatey.

هل تعلم أن Azure Cloud Shell يحتوي على Terraform مثبت مسبقًا؟

بمجرد تنزيل Terraform، انسخه إلى مجلد في مسارك وشغل terraform. يجب أن ترى بعض تعليمات الاستخدام كما هو موضح أدناه. إذا رأيت هذا، فأنت جاهز للمتابعة.

Terraform Usage Instructions

المصادقة على Azure

يستخدم Terraform موفرين للتحدث مع موردي خدمات السحابة والخوادم المحلية المختلفة. في هذه الحالة، تحتاج إلى تكوين موفر خدمة Azure لـ Terraform. بافتراض أن لديك Azure CLI مثبتًا وأنت مصادق على Azure بالفعل، تحتاج أولاً إلى إنشاء مبدأ خدمة. سيستخدم Terraform مبدأ الخدمة للمصادقة والحصول على الوصول إلى اشتراكك في 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

سيقوم Azure CLI بالاتصال بـ 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 باستخدام 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 للتحقق من صحة التكوين لأي أخطاء في الصياغة. للقيام بذلك، قم بتشغيل الأمر terraform plan. يقرأ هذا الأمر ملفات التكوين في الدليل ويقوم بالإبلاغ عن أي أخطاء.

تأكد من إصلاح أي أخطاء يكشفها terraform plan قبل محاولة توفير البنية التحتية فعليًا!

بناء Azure VM باستخدام Terraform

وأخيرًا، حان الوقت لبناء Azure VM فعليًا عن طريق تشغيل terraform apply. عند تشغيل terraform apply، يقوم Terraform بقراءة أي ملفات تكوين لديك في الدليل ويطلب تأكيدك. بمجرد كتابة “نعم”، سيتصل بـ Azure ويبدأ ببناء VM وجميع الموارد المرتبطة.

Buildign Azure VM

إذا رأيت النص اللامع واللامع باللون الأخضر Apply complete! في الأسفل، فقد قام Terraform ببناء الموارد بنجاح!

التنظيف

نظرًا لأن هذا كان مجرد عرض توضيحي وربما لن تخطط للحفاظ على هذه الـ VM، تأكد من أن تقوم بتنظيف كل ما قمت به.

قمت بإنشاء ممثل خدمة لـ Terraform للمصادقة على 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

بعد ذلك، قم بإزالة Azure VM التي قمت بإنشائها للتو وجميع الموارد الأخرى في ملف التكوين باستخدام terraform destroy. إذا كنت ترغب في التحقق من صحة التكوين واختبار ما سيحدث إذا قمت بتشغيل terraform destroy، يمكنك أيضًا تشغيل terraform plan -destroy.

الختام

تيرافورم هو أداة رائعة ومجانية لبناء البنية التحتية في العديد من المجالات المختلفة. تعلم بنية الجملة في HCL هو أصعب جزء في تيرافورم ولكن بصراحة، HCL هي لغة بديهية. إذا كنت تفكر في استخدام أداة مثل تيرافورم أو قوالب ARM، على سبيل المثال، تعلم تيرافورم!

تيرافورم هي أداة صناعية شهيرة الآن مع دعم مجتمع رائع والعديد من الأشخاص للمساعدة!

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