Szybki start: tworzenie topologii sieci siatki za pomocą usługi Azure Virtual Network Manager przy użyciu narzędzia Terraform
Rozpocznij pracę z usługą Azure Virtual Network Manager przy użyciu narzędzia Terraform, aby aprowizować łączność dla wszystkich sieci wirtualnych.
W tym przewodniku Szybki start wdrożysz trzy sieci wirtualne i użyjesz usługi Azure Virtual Network Manager, aby utworzyć topologię sieci siatki. Następnie należy sprawdzić, czy konfiguracja łączności została zastosowana. Możesz wybrać wdrożenie z zakresem subskrypcji lub zakresem grupy zarządzania. Dowiedz się więcej o zakresach menedżera sieci.
Narzędzie Terraform umożliwia definiowanie, wyświetlanie wersji zapoznawczej i wdrażanie infrastruktury chmury. Za pomocą narzędzia Terraform tworzysz pliki konfiguracji przy użyciu składni HCL. Składnia listy HCL umożliwia określenie dostawcy chmury — takiego jak platforma Azure — oraz elementów tworzących infrastrukturę chmury. Po utworzeniu plików konfiguracji utworzysz plan wykonywania, który umożliwia wyświetlenie podglądu zmian infrastruktury przed ich wdrożeniem. Po zweryfikowaniu zmian należy zastosować plan wykonywania w celu wdrożenia infrastruktury.
W tym artykule omówiono sposób wykonywania następujących zadań:
- Utwórz losową wartość dla nazwy grupy zasobów platformy Azure przy użyciu random_pet.
- Utwórz grupę zasobów platformy Azure przy użyciu azurerm_resource_group.
- Utwórz tablicę sieci wirtualnych przy użyciu azurerm_virtual_network.
- Utwórz tablicę podsieci przy użyciu azurerm_subnet.
- Utwórz menedżera sieci wirtualnej przy użyciu azurerm_virtual_network_manager.
- Utwórz grupę sieciową menedżera sieci przy użyciu azurerm_network_manager_network_group.
- Utwórz statyczny element członkowski menedżera sieci przy użyciu azurerm_network_manager_static_member.
- Utwórz konfigurację łączności menedżera sieci przy użyciu azurerm_network_manager_connectivity_configuration.
- Utwórz wdrożenie menedżera sieci przy użyciu azurerm_network_manager_deployment.
Wymagania wstępne
- Instalowanie i konfigurowanie narzędzia Terraform
- Aby zmodyfikować dynamiczne grupy sieciowe, należy udzielić dostępu tylko za pośrednictwem przypisania roli RBAC platformy Azure. Administrator klasyczny/starsza wersja autoryzacji nie jest obsługiwana
Implementowanie kodu narzędzia Terraform
Ten przykładowy kod implementuje menedżera usługi Azure Virtual Network Manager w zakresie subskrypcji.
Uwaga
Przykładowy kod tego artykułu znajduje się w repozytorium GitHub programu Azure Terraform. Możesz wyświetlić plik dziennika zawierający wyniki testu z bieżących i poprzednich wersji programu Terraform.
Zobacz więcej artykułów i przykładowego kodu pokazującego, jak zarządzać zasobami platformy Azure za pomocą narzędzia Terraform
Utwórz katalog, w którym chcesz przetestować i uruchomić przykładowy kod programu Terraform i utworzyć go jako bieżący katalog.
Utwórz plik o nazwie
providers.tf
i wstaw następujący kod: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 {} }
Utwórz plik o nazwie
main.tf
i wstaw następujący kod:# 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] }
Utwórz plik o nazwie
variables.tf
i wstaw następujący kod: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" }
Utwórz plik o nazwie
outputs.tf
i wstaw następujący kod:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "virtual_network_names" { value = azurerm_virtual_network.vnet[*].name }
Implementowanie kodu narzędzia Terraform
Ten przykładowy kod będzie implementować usługę Azure Virtual Network Manager w zakresie grupy zarządzania.
Uwaga
Przykładowy kod tego artykułu znajduje się w repozytorium GitHub programu Azure Terraform. Możesz wyświetlić plik dziennika zawierający wyniki testu z bieżących i poprzednich wersji programu Terraform.
Zobacz więcej artykułów i przykładowego kodu pokazującego, jak zarządzać zasobami platformy Azure za pomocą narzędzia Terraform
Utwórz katalog, w którym chcesz przetestować i uruchomić przykładowy kod programu Terraform i utworzyć go jako bieżący katalog.
Utwórz plik o nazwie
providers.tf
i wstaw następujący kod: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 {} }
Utwórz plik o nazwie
main.tf
i wstaw następujący kod:# 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] }
Utwórz plik o nazwie
variables.tf
i wstaw następujący kod: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 }
Utwórz plik o nazwie
outputs.tf
i wstaw następujący kod:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "virtual_network_names" { value = azurerm_virtual_network.vnet[*].name }
Inicjowanie narzędzia Terraform
Uruchom narzędzie terraform init , aby zainicjować wdrożenie narzędzia Terraform. To polecenie pobiera dostawcę platformy Azure wymaganego do zarządzania zasobami platformy Azure.
terraform init -upgrade
Kluczowe punkty:
- Parametr
-upgrade
uaktualnia niezbędne wtyczki dostawcy do najnowszej wersji, która jest zgodna z ograniczeniami wersji konfiguracji.
Tworzenie planu wykonania programu Terraform
Uruchom plan terraform, aby utworzyć plan wykonania.
terraform plan -out main.tfplan
Kluczowe punkty:
- Polecenie
terraform plan
tworzy plan wykonania, ale nie wykonuje go. Zamiast tego określa, jakie akcje są niezbędne do utworzenia konfiguracji określonej w plikach konfiguracji. Ten wzorzec umożliwia sprawdzenie, czy plan wykonania jest zgodny z oczekiwaniami przed wprowadzeniem jakichkolwiek zmian w rzeczywistych zasobach. - Opcjonalny
-out
parametr umożliwia określenie pliku wyjściowego dla planu. Użycie parametru-out
gwarantuje, że sprawdzony plan jest dokładnie tym, co jest stosowane.
Stosowanie planu wykonywania narzędzia Terraform
Uruchom narzędzie terraform, aby zastosować plan wykonania do infrastruktury chmury.
terraform apply main.tfplan
Kluczowe punkty:
- Przykładowe
terraform apply
polecenie zakłada, że wcześniej uruchomionoterraform plan -out main.tfplan
polecenie . - Jeśli określono inną nazwę pliku parametru
-out
, użyj tej samej nazwy pliku w wywołaniu metodyterraform apply
. - Jeśli parametr nie został użyty, wywołaj metodę
-out
terraform apply
bez żadnych parametrów.
Weryfikowanie wyników
Pobierz nazwę grupy zasobów platformy Azure.
resource_group_name=$(terraform output -raw resource_group_name)
Pobierz nazwy sieci wirtualnej.
terraform output virtual_network_names
Dla każdej nazwy sieci wirtualnej wydrukowanej w poprzednim kroku uruchom polecenie az network manager list-effective-connectivity-config , aby wydrukować obowiązujące (zastosowane) konfiguracje. Zastąp
<virtual_network_name>
symbol zastępczy nazwą sieci wirtualnej.az network manager list-effective-connectivity-config \ --resource-group $resource_group_name \ --vnet-name <virtual_network_name>
Czyszczenie zasobów
Jeśli zasoby utworzone za pomocą narzędzia Terraform nie są już potrzebne, wykonaj następujące czynności:
Uruchom plan terraform i określ flagę
destroy
.terraform plan -destroy -out main.destroy.tfplan
Kluczowe punkty:
- Polecenie
terraform plan
tworzy plan wykonania, ale nie wykonuje go. Zamiast tego określa, jakie akcje są niezbędne do utworzenia konfiguracji określonej w plikach konfiguracji. Ten wzorzec umożliwia sprawdzenie, czy plan wykonania jest zgodny z oczekiwaniami przed wprowadzeniem jakichkolwiek zmian w rzeczywistych zasobach. - Opcjonalny
-out
parametr umożliwia określenie pliku wyjściowego dla planu. Użycie parametru-out
gwarantuje, że sprawdzony plan jest dokładnie tym, co jest stosowane.
- Polecenie
Uruchom narzędzie terraform zastosuj, aby zastosować plan wykonania.
terraform apply main.destroy.tfplan
Rozwiązywanie problemów z programem Terraform na platformie Azure
Rozwiązywanie typowych problemów podczas korzystania z narzędzia Terraform na platformie Azure