التشغيل السريع: استخدم Terraform لإنشاء الأجهزة الافتراضية الخاصة بــ Linux
ينطبق على: ✔️ أجهزة Linux الظاهرية
تم اختبار المقالة باستخدام إصدارات موفر Terraform وTerraform التالية:
توضح لك هذه المقالة كيفية إنشاء بيئة Linux كاملة ودعم الموارد باستخدام Terraform. تتضمن هذه الموارد شبكة ظاهرية وشبكة فرعية وعنوان IP عام والمزيد.
يتيح Terraform تعريف البنية الأساسية السحابية ومعاينتها ونشرها. باستخدام Terraform، يمكنك إنشاء ملفات التكوين باستخدام بناء جملة HCL. يسمح لك بناء الجملة بلغة HCL بتحديد موفر الخدمة السحابية، مثل خدمة Azure، وتحديد العناصر التي تشكل البنية الأساسية للخدمة السحابية. بعد إنشاء ملفات التكوين الخاصة بك، يمكنك إنشاء خطة تنفيذ تسمح لك بمعاينة تغييرات البنية الأساسية قبل نشرها. بمجرد التحقق من التغييرات، يمكنك تطبيق خطة التنفيذ لنشر البنية الأساسية.
في هذه المقالة، ستتعرف على كيفية:
- إنشاء قيمة عشوائية لاسم مجموعة موارد Azure باستخدام random_pet.
- إنشاء مجموعة موارد Azure باستخدام azurerm_resource_group.
- إنشاء شبكة ظاهرية (VNET) باستخدام azurerm_virtual_network.
- إنشاء شبكة فرعية باستخدام azurerm_subnet.
- إنشاء IP عام باستخدام azurerm_public_ip.
- إنشاء مجموعة أمان شبكة باستخدام azurerm_network_security_group.
- إنشاء واجهة شبكة باستخدام azurerm_network_interface.
- إنشاء اقتران بين مجموعة أمان الشبكة وواجهة الشبكة باستخدام azurerm_network_interface_security_group_association.
- إنشاء قيمة عشوائية لاسم حساب تخزين فريد باستخدام random_id.
- إنشاء حساب تخزين لتشخيصات التمهيد باستخدام azurerm_storage_account.
- إنشاء جهاز ظاهري يعمل بنظام Linux باستخدام azurerm_linux_virtual_machine
- إنشاء azapi_resource مورد AzAPI.
- إنشاء مورد AzAPI لإنشاء زوج مفاتيح SSH باستخدام azapi_resource_action.
المتطلبات الأساسية
تنفيذ كود Terraform
إشعار
يوجد نموذج التعليمات البرمجية لهذه المقالة في مستودع Azure Terraform GitHub. يمكنك عرض ملف السجل الذي يحتوي على نتائج الاختبار من الإصدارات الحالية والسابقة من Terraform.
راجع المزيد من المقالات ونماذج التعليمات البرمجية التي توضح كيفية استخدام Terraform لإدارة موارد Azure
قم بإنشاء دليل لاختبار نموذج التعليمة البرمجية لـ Terraform وجعله الدليل الحالي.
قم بإنشاء ملف باسم
providers.tf
وأدخل التعليمة البرمجية التالية:terraform { required_version = ">=0.12" required_providers { azapi = { source = "azure/azapi" version = "~>1.5" } azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
قم بإنشاء ملف باسم
ssh.tf
وأدخل التعليمة البرمجية التالية:resource "random_pet" "ssh_key_name" { prefix = "ssh" separator = "" } resource "azapi_resource_action" "ssh_public_key_gen" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" resource_id = azapi_resource.ssh_public_key.id action = "generateKeyPair" method = "POST" response_export_values = ["publicKey", "privateKey"] } resource "azapi_resource" "ssh_public_key" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" name = random_pet.ssh_key_name.id location = azurerm_resource_group.rg.location parent_id = azurerm_resource_group.rg.id } output "key_data" { value = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey }
قم بإنشاء ملف باسم
main.tf
وأدخل التعليمة البرمجية التالية:resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id } # Create virtual network resource "azurerm_virtual_network" "my_terraform_network" { name = "myVnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } # Create subnet resource "azurerm_subnet" "my_terraform_subnet" { name = "mySubnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.my_terraform_network.name address_prefixes = ["10.0.1.0/24"] } # Create public IPs resource "azurerm_public_ip" "my_terraform_public_ip" { name = "myPublicIP" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Dynamic" } # Create Network Security Group and rule resource "azurerm_network_security_group" "my_terraform_nsg" { name = "myNetworkSecurityGroup" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name security_rule { name = "SSH" priority = 1001 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "22" source_address_prefix = "*" destination_address_prefix = "*" } } # Create network interface resource "azurerm_network_interface" "my_terraform_nic" { name = "myNIC" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "my_nic_configuration" subnet_id = azurerm_subnet.my_terraform_subnet.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.my_terraform_public_ip.id } } # Connect the security group to the network interface resource "azurerm_network_interface_security_group_association" "example" { network_interface_id = azurerm_network_interface.my_terraform_nic.id network_security_group_id = azurerm_network_security_group.my_terraform_nsg.id } # Generate random text for a unique storage account name resource "random_id" "random_id" { keepers = { # Generate a new ID only when a new resource group is defined resource_group = azurerm_resource_group.rg.name } byte_length = 8 } # Create storage account for boot diagnostics resource "azurerm_storage_account" "my_storage_account" { name = "diag${random_id.random_id.hex}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name account_tier = "Standard" account_replication_type = "LRS" } # Create virtual machine resource "azurerm_linux_virtual_machine" "my_terraform_vm" { name = "myVM" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name network_interface_ids = [azurerm_network_interface.my_terraform_nic.id] size = "Standard_DS1_v2" os_disk { name = "myOsDisk" caching = "ReadWrite" storage_account_type = "Premium_LRS" } source_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts-gen2" version = "latest" } computer_name = "hostname" admin_username = var.username admin_ssh_key { username = var.username public_key = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey } boot_diagnostics { storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint } }
قم بإنشاء ملف باسم
variables.tf
وأدخل التعليمة البرمجية التالية:variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "username" { type = string description = "The username for the local account that will be created on the new VM." default = "azureadmin" }
قم بإنشاء ملف باسم
outputs.tf
وأدخل التعليمة البرمجية التالية:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "public_ip_address" { value = azurerm_linux_virtual_machine.my_terraform_vm.public_ip_address }
تهيئة Terraform
قم بتشغيل terraform init لتهيئة توزيع Terraform. يقوم هذا الأمر بتنزيل موفر Azure المطلوب لإدارة موارد Azure.
terraform init -upgrade
النقاط الرئيسية:
- تقوم
-upgrade
المعلمة بترقية مكونات الموفر الإضافية الضرورية إلى أحدث إصدار يتوافق مع قيود إصدار التكوين.
إنشاء خطة تنفيذ Terraform
قم بتشغيل خطة terraform لإنشاء خطة تنفيذ.
terraform plan -out main.tfplan
النقاط الرئيسية:
- ينشئ الأمر
terraform plan
خطة تنفيذ، لكنه لا ينفذها. بدلًا من ذلك، يحدد الإجراءات الضرورية لإنشاء التكوين المحدد في ملفات التكوين الخاصة بك. يسمح لك هذا النمط بالتحقق مما إذا كانت خطة التنفيذ تتطابق مع توقعاتك قبل إجراء أي تغييرات على الموارد الفعلية. - تسمح المعلمة
-out
الاختيارية بتحديد ملف الإخراج للخطة. يضمن استخدام-out
المعلمة أن الخطة التي راجعتها هي بالضبط ما يتم تطبيقها. - لقراءة المزيد حول خطط التنفيذ والأمان المستمرين، راجع قسم تحذيرات الأمان.
تطبيق خطة تنفيذ Terraform
قم بتشغيل تطبيق terraform لتطبيق خطة التنفيذ على البنية الأساسية السحابية الخاصة بك.
terraform apply main.tfplan
النقاط الرئيسية:
- يفترض الأمر المثال
terraform apply
أنك قمت بتشغيلterraform plan -out main.tfplan
مسبقا . - إذا قمت بتحديد اسم ملف مختلف للمعلمة
-out
، فاستخدم نفس اسم الملف في الاستدعاءterraform apply
. - إذا لم تستخدم المعلمة
-out
، استدعterraform apply
دون أي معلمات.
لا يتم تقديم معلومات التكلفة أثناء عملية إنشاء الجهاز الظاهري ل Terraform كما هي لمدخل Azure. إذا كنت ترغب في معرفة المزيد حول كيفية عمل التكلفة للأجهزة الظاهرية ، راجع صفحة نظرة عامة على تحسين التكلفة.
تحقق من النتائج
احصل على اسم مجموعة موارد Azure.
resource_group_name=$(terraform output -raw resource_group_name)
قم بتشغيل قائمة az vm مع استعلام JMESPath لعرض أسماء الأجهزة الظاهرية التي تم إنشاؤها في مجموعة الموارد.
az vm list \ --resource-group $resource_group_name \ --query "[].{\"VM Name\":name}" -o table
تنظيف الموارد
عندما لم تعد بحاجة إلى الموارد التي تم إنشاؤها عبر Terraform، قم بالخطوات التالية:
قم بتشغيل خطة terraform وحدد العلامة
destroy
.terraform plan -destroy -out main.destroy.tfplan
النقاط الرئيسية:
- ينشئ الأمر
terraform plan
خطة تنفيذ، لكنه لا ينفذها. بدلًا من ذلك، يحدد الإجراءات الضرورية لإنشاء التكوين المحدد في ملفات التكوين الخاصة بك. يسمح لك هذا النمط بالتحقق مما إذا كانت خطة التنفيذ تتطابق مع توقعاتك قبل إجراء أي تغييرات على الموارد الفعلية. - تسمح المعلمة
-out
الاختيارية بتحديد ملف الإخراج للخطة. يضمن استخدام-out
المعلمة أن الخطة التي راجعتها هي بالضبط ما يتم تطبيقها. - لقراءة المزيد حول خطط التنفيذ والأمان المستمرين، راجع قسم تحذيرات الأمان.
- ينشئ الأمر
قم بتشغيل تطبيق terraform لتطبيق خطة التنفيذ.
terraform apply main.destroy.tfplan
استكشاف أخطاء Terraform على Azure وإصلاحها
استكشاف المشاكل الشائعة وإصلاحها عند استخدام Terraform على Azure
الخطوات التالية
في هذا التشغيل السريع، قمت بتوزيع جهاز ظاهري بسيط باستخدام ملف Terraform. لمعرفة المزيد عن الأجهزة الظاهرية Azure، تابع البرنامج التعليمي لنظام إدارة البرامج لينكس.