التشغيل السريع: إنشاء تخطيط شبكة اتصال باستخدام Azure Virtual Network Manager باستخدام Terraform
ابدأ مع Azure Virtual Network Manager باستخدام Terraform لتوفير الاتصال لجميع الشبكات الظاهرية.
في هذا التشغيل السريع، يمكنك نشر ثلاث شبكات ظاهرية واستخدام Azure Virtual Network Manager لإنشاء تخطيط شبكة شبكة اتصال. ثم تحقق من تطبيق تكوين الاتصال. يمكنك الاختيار من بين عملية نشر ذات نطاق اشتراك أو نطاق مجموعة إدارة. تعرف على المزيد حول نطاقات إدارة الشبكة.
يتيح Terraform تعريف البنية الأساسية السحابية ومعاينتها ونشرها. باستخدام Terraform، يمكنك إنشاء ملفات التكوين باستخدام بناء جملة HCL. يسمح لك بناء الجملة بلغة HCL بتحديد موفر الخدمة السحابية، مثل خدمة Azure، وتحديد العناصر التي تشكل البنية الأساسية للخدمة السحابية. بعد إنشاء ملفات التكوين الخاصة بك، يمكنك إنشاء خطة تنفيذ تسمح لك بمعاينة تغييرات البنية الأساسية قبل نشرها. بمجرد التحقق من التغييرات، يمكنك تطبيق خطة التنفيذ لنشر البنية الأساسية.
في هذه المقالة، ستتعرف على كيفية:
- إنشاء قيمة عشوائية لاسم مجموعة موارد Azure باستخدام random_pet.
- إنشاء مجموعة موارد Azure باستخدام azurerm_resource_group.
- إنشاء صفيف من الشبكات الظاهرية باستخدام azurerm_virtual_network.
- إنشاء صفيف من الشبكات الفرعية باستخدام azurerm_subnet.
- إنشاء مدير شبكة ظاهرية باستخدام azurerm_virtual_network_manager.
- إنشاء مجموعة شبكة إدارة شبكة باستخدام azurerm_network_manager_network_group.
- إنشاء عضو ثابت لمدير الشبكة باستخدام azurerm_network_manager_static_member.
- إنشاء تكوين اتصال مدير شبكة باستخدام azurerm_network_manager_connectivity_configuration.
- إنشاء توزيع مدير شبكة باستخدام azurerm_network_manager_deployment.
- قم بتثبيت Terraform وتكوينه
- لتعديل مجموعات الشبكة الديناميكية، يجب منحك حق الوصول عبر تعيين دور Azure RBAC فقط. التخويل الكلاسيكي للمسؤول/القديم غير مدعوم
ينفذ نموذج التعليمات البرمجية هذا Azure Virtual Network Manager في نطاق الاشتراك.
ملاحظة
يوجد نموذج التعليمات البرمجية لهذه المقالة في مستودع Azure Terraform GitHub. يمكنك عرض ملف السجل الذي يحتوي على نتائج الاختبار من الإصدارات الحالية والسابقة من Terraform.
راجع المزيد من المقالات ونماذج التعليمات البرمجية التي توضح كيفية استخدام Terraform لإدارة موارد Azure
إنشاء دليل لاختبار وتشغيل نموذج تعليمة برمجية Terraform وجعله الدليل الحالي.
قم بإنشاء ملف باسم
providers.tf
وأدخل التعليمة البرمجية التالية:terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.56.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
قم بإنشاء ملف باسم
main.tf
وأدخل التعليمة البرمجية التالية:# Create the Resource Group 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 three virtual networks resource "random_string" "prefix" { length = 4 special = false upper = false } resource "random_pet" "virtual_network_name" { prefix = "vnet-${random_string.prefix.result}" } resource "azurerm_virtual_network" "vnet" { count = 3 name = "${random_pet.virtual_network_name.id}-0${count.index}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location address_space = ["10.${count.index}.0.0/16"] } # Add a subnet to each virtual network resource "azurerm_subnet" "subnet_vnet" { count = 3 name = "default" virtual_network_name = azurerm_virtual_network.vnet[count.index].name resource_group_name = azurerm_resource_group.rg.name address_prefixes = ["10.${count.index}.0.0/24"] } # Create a Virtual Network Manager instance data "azurerm_subscription" "current" { } resource "azurerm_network_manager" "network_manager_instance" { name = "network-manager" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name scope_accesses = ["Connectivity"] description = "example network manager" scope { subscription_ids = [data.azurerm_subscription.current.id] } } # Create a network group resource "azurerm_network_manager_network_group" "network_group" { name = "network-group" network_manager_id = azurerm_network_manager.network_manager_instance.id } # Add three virtual networks to a network group as dynamic members with Azure Policy resource "random_pet" "network_group_policy_name" { prefix = "network-group-policy" } resource "azurerm_policy_definition" "network_group_policy" { name = "${random_pet.network_group_policy_name.id}" policy_type = "Custom" mode = "Microsoft.Network.Data" display_name = "Policy Definition for Network Group" metadata = <<METADATA { "category": "Azure Virtual Network Manager" } METADATA policy_rule = <<POLICY_RULE { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/virtualNetworks" }, { "allOf": [ { "field": "Name", "contains": "${random_pet.virtual_network_name.id}" } ] } ] }, "then": { "effect": "addToNetworkGroup", "details": { "networkGroupId": "${azurerm_network_manager_network_group.network_group.id}" } } } POLICY_RULE } resource "azurerm_subscription_policy_assignment" "azure_policy_assignment" { name = "${random_pet.network_group_policy_name.id}-policy-assignment" policy_definition_id = azurerm_policy_definition.network_group_policy.id subscription_id = data.azurerm_subscription.current.id } # Create a connectivity configuration resource "azurerm_network_manager_connectivity_configuration" "connectivity_config" { name = "connectivity-config" network_manager_id = azurerm_network_manager.network_manager_instance.id connectivity_topology = "Mesh" applies_to_group { group_connectivity = "None" network_group_id = azurerm_network_manager_network_group.network_group.id } } # Commit deployment resource "azurerm_network_manager_deployment" "commit_deployment" { network_manager_id = azurerm_network_manager.network_manager_instance.id location = azurerm_resource_group.rg.location scope_access = "Connectivity" configuration_ids = [azurerm_network_manager_connectivity_configuration.connectivity_config.id] }
قم بإنشاء ملف باسم
variables.tf
وأدخل التعليمة البرمجية التالية:variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." default = "rg" }
قم بإنشاء ملف باسم
outputs.tf
وأدخل التعليمة البرمجية التالية:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "virtual_network_names" { value = azurerm_virtual_network.vnet[*].name }
سيقوم نموذج التعليمات البرمجية هذا بتنفيذ Azure Virtual Network Manager في نطاق مجموعة الإدارة.
ملاحظة
يوجد نموذج التعليمات البرمجية لهذه المقالة في مستودع Azure Terraform GitHub. يمكنك عرض ملف السجل الذي يحتوي على نتائج الاختبار من الإصدارات الحالية والسابقة من Terraform.
راجع المزيد من المقالات ونماذج التعليمات البرمجية التي توضح كيفية استخدام Terraform لإدارة موارد Azure
إنشاء دليل لاختبار وتشغيل نموذج تعليمة برمجية Terraform وجعله الدليل الحالي.
قم بإنشاء ملف باسم
providers.tf
وأدخل التعليمة البرمجية التالية:terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.56.0, < 4.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
قم بإنشاء ملف باسم
main.tf
وأدخل التعليمة البرمجية التالية:# Create the Resource Group 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 three virtual networks resource "random_string" "prefix" { length = 4 special = false upper = false } resource "random_pet" "virtual_network_name" { prefix = "vnet-${random_string.prefix.result}" } resource "azurerm_virtual_network" "vnet" { count = 3 name = "${random_pet.virtual_network_name.id}-0${count.index}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location address_space = ["10.${count.index}.0.0/16"] } # Add a subnet to each virtual network resource "azurerm_subnet" "subnet_vnet" { count = 3 name = "default" virtual_network_name = azurerm_virtual_network.vnet[count.index].name resource_group_name = azurerm_resource_group.rg.name address_prefixes = ["10.${count.index}.0.0/24"] } data "azurerm_subscription" "current" { } # Create a Management Group resource "random_pet" "management_group_name" { prefix = "AVNM-management-group" } resource "azurerm_management_group" "mg" { display_name = random_pet.management_group_name.id subscription_ids = [ data.azurerm_subscription.current.subscription_id, ] } data "azurerm_client_config" "this" {} resource "azurerm_role_assignment" "management_group_owner" { principal_id = coalesce(var.msi_id, data.azurerm_client_config.this.object_id) scope = azurerm_management_group.mg.id role_definition_name = "Contributor" } # register Microsoft.Network to the Management Group resource "null_resource" "register_rp_to_mg" { provisioner "local-exec" { command = "az provider register --namespace Microsoft.Network -m ${azurerm_management_group.mg.name}" } depends_on = [azurerm_role_assignment.management_group_owner] } resource "time_sleep" "wait_5_seconds" { create_duration = "5s" depends_on = [null_resource.register_rp_to_mg] } # Create a Virtual Network Manager instance resource "azurerm_network_manager" "network_manager_instance" { name = "network-manager" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name scope_accesses = ["Connectivity"] description = "example network manager" scope { management_group_ids = [azurerm_management_group.mg.id] } depends_on = [time_sleep.wait_5_seconds] } # Create a network group resource "azurerm_network_manager_network_group" "network_group" { name = "network-group" network_manager_id = azurerm_network_manager.network_manager_instance.id } # Add three virtual networks to a network group as dynamic members with Azure Policy resource "random_pet" "network_group_policy_name" { prefix = "network-group-policy" } resource "azurerm_policy_definition" "network_group_policy" { name = random_pet.network_group_policy_name.id policy_type = "Custom" mode = "Microsoft.Network.Data" display_name = "Policy Definition for Network Group" metadata = <<METADATA { "category": "Azure Virtual Network Manager" } METADATA policy_rule = <<POLICY_RULE { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/virtualNetworks" }, { "allOf": [ { "field": "Name", "contains": "${random_pet.virtual_network_name.id}" } ] } ] }, "then": { "effect": "addToNetworkGroup", "details": { "networkGroupId": "${azurerm_network_manager_network_group.network_group.id}" } } } POLICY_RULE } resource "azurerm_subscription_policy_assignment" "azure_policy_assignment" { name = "${random_pet.network_group_policy_name.id}-policy-assignment" policy_definition_id = azurerm_policy_definition.network_group_policy.id subscription_id = data.azurerm_subscription.current.id } # Create a connectivity configuration resource "azurerm_network_manager_connectivity_configuration" "connectivity_config" { name = "connectivity-config" network_manager_id = azurerm_network_manager.network_manager_instance.id connectivity_topology = "Mesh" applies_to_group { group_connectivity = "None" network_group_id = azurerm_network_manager_network_group.network_group.id } } # Commit deployment resource "azurerm_network_manager_deployment" "commit_deployment" { network_manager_id = azurerm_network_manager.network_manager_instance.id location = azurerm_resource_group.rg.location scope_access = "Connectivity" configuration_ids = [azurerm_network_manager_connectivity_configuration.connectivity_config.id] }
قم بإنشاء ملف باسم
variables.tf
وأدخل التعليمة البرمجية التالية:variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." default = "rg" } variable "msi_id" { type = string description = "(Optional) Manage identity id that be used as authentication method. Defaults to `null`." default = null }
قم بإنشاء ملف باسم
outputs.tf
وأدخل التعليمة البرمجية التالية:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "virtual_network_names" { value = azurerm_virtual_network.vnet[*].name }
قم بتشغيل terraform init لتهيئة توزيع Terraform. يقوم هذا الأمر بتنزيل موفر Azure المطلوب لإدارة موارد Azure.
terraform init -upgrade
النقاط الرئيسية:
- تقوم
-upgrade
المعلمة بترقية مكونات الموفر الإضافية الضرورية إلى أحدث إصدار يتوافق مع قيود إصدار التكوين.
قم بتشغيل خطة terraform لإنشاء خطة تنفيذ.
terraform plan -out main.tfplan
النقاط الرئيسية:
- ينشئ الأمر
terraform plan
خطة تنفيذ، لكنه لا ينفذها. بدلًا من ذلك، يحدد الإجراءات الضرورية لإنشاء التكوين المحدد في ملفات التكوين الخاصة بك. يسمح لك هذا النمط بالتحقق مما إذا كانت خطة التنفيذ تتطابق مع توقعاتك قبل إجراء أي تغييرات على الموارد الفعلية. - تسمح المعلمة
-out
الاختيارية بتحديد ملف الإخراج للخطة. يضمن استخدام-out
المعلمة أن الخطة التي راجعتها هي بالضبط ما يتم تطبيقها.
قم بتشغيل تطبيق terraform لتطبيق خطة التنفيذ على البنية الأساسية السحابية الخاصة بك.
terraform apply main.tfplan
النقاط الرئيسية:
- يفترض الأمر المثال
terraform apply
أنك قمت بتشغيلterraform plan -out main.tfplan
مسبقا . - إذا قمت بتحديد اسم ملف مختلف للمعلمة
-out
، فاستخدم نفس اسم الملف في الاستدعاءterraform apply
. - إذا لم تستخدم المعلمة
-out
، استدعterraform apply
دون أي معلمات.
احصل على اسم مجموعة موارد Azure.
resource_group_name=$(terraform output -raw resource_group_name)
الحصول على أسماء الشبكة الظاهرية.
terraform output virtual_network_names
لكل اسم شبكة ظاهرية مطبوع في الخطوة السابقة، قم بتشغيل az network manager list-effective-connectivity-config لطباعة التكوينات الفعالة (المطبقة).
<virtual_network_name>
استبدل العنصر النائب باسم الشبكة الظاهرية.az network manager list-effective-connectivity-config \ --resource-group $resource_group_name \ --vnet-name <virtual_network_name>
عندما لم تعد بحاجة إلى الموارد التي تم إنشاؤها عبر Terraform، قم بالخطوات التالية:
قم بتشغيل خطة terraform وحدد العلامة
destroy
.terraform plan -destroy -out main.destroy.tfplan
النقاط الرئيسية:
- ينشئ الأمر
terraform plan
خطة تنفيذ، لكنه لا ينفذها. بدلًا من ذلك، يحدد الإجراءات الضرورية لإنشاء التكوين المحدد في ملفات التكوين الخاصة بك. يسمح لك هذا النمط بالتحقق مما إذا كانت خطة التنفيذ تتطابق مع توقعاتك قبل إجراء أي تغييرات على الموارد الفعلية. - تسمح المعلمة
-out
الاختيارية بتحديد ملف الإخراج للخطة. يضمن استخدام-out
المعلمة أن الخطة التي راجعتها هي بالضبط ما يتم تطبيقها.
- ينشئ الأمر
قم بتشغيل تطبيق terraform لتطبيق خطة التنفيذ.
terraform apply main.destroy.tfplan
استكشاف المشاكل الشائعة وإصلاحها عند استخدام Terraform على Azure