Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här snabbstarten använder du Terraform för att distribuera en Azure-brandvägg med ip-exempelgrupper som används i en nätverksregel och en programregel. En IP-grupp är en resurs på den översta nivån som gör att du kan definiera och gruppera IP-adresser, intervall och undernät i ett enda objekt. IP-grupp är användbar för att hantera IP-adresser i Azure Firewall-regler. Du kan antingen ange IP-adresser manuellt eller importera dem från en fil.
Terraform möjliggör definition, förhandsversion och distribution av molninfrastruktur. Med Terraform skapar du konfigurationsfiler med hjälp av HCL-syntax. Med HCL-syntaxen kan du ange molnleverantören – till exempel Azure – och de element som utgör din molninfrastruktur. När du har skapat konfigurationsfilerna skapar du en körningsplan som gör att du kan förhandsgranska ändringarna i infrastrukturen innan de distribueras. När du har verifierat ändringarna tillämpar du genomförandeplanen för att implementera infrastrukturen.
I den här artikeln lär du dig att:
- Skapa ett slumpmässigt värde (som ska användas i resursgruppens namn) med hjälp av random_pet
- Skapa en Azure-resursgrupp med hjälp av azurerm_resource_group
- Skapa ett slumpmässigt lösenord för den virtuella Windows-datorn med random_password
- Skapa ett slumpmässigt värde (som ska användas som lagringsnamn) med hjälp av random_string
- Skapa en offentlig IP-adress i Azure med hjälp av azurerm_public_ip
- Skapa ett lagringskonto med azurerm_storage_account
- Skapa en Azure Firewall-princip med azurerm_firewall_policy
- Skapa en Azure Firewall Policy Rule Collection Group med azurerm_firewall_policy_rule_collection_group
- Skapa en Azure Firewall med hjälp av azurerm_firewall
- Skapa en Azure IP-grupp med hjälp av azurerm_ip_group
- Skapa ett virtuellt Azure-nätverk med azurerm_virtual_network
- Skapa tre Azure-undernät med hjälp av azurerm_subnet
- Skapa ett nätverksgränssnitt med azurerm_network_interface
- Skapa en nätverkssäkerhetsgrupp (som ska innehålla en lista över nätverkssäkerhetsregler) med hjälp av azurerm_network_security_group
- Skapa en association mellan nätverksgränssnittet och nätverkssäkerhetsgruppen med – azurerm_network_interface_security_group_association
- Skapa en virtuell Azure Linux-dator med azurerm_linux_virtual_machine
- Skapa en routningstabell med azurerm_route_table
- Skapa en association mellan routningstabellen och undernätet med – azurerm_subnet_route_table_association
- Skapa en AzAPI-resurs azapi_resource.
- Skapa en AzAPI-resurs för att generera ett SSH-nyckelpar med hjälp av azapi_resource_action.
Förutsättningar
Implementera koden med Terraform
Anmärkning
Exempelkoden för den här artikeln finns på Azure Terraform GitHub-lagringsplatsen. Du kan visa loggfilen som innehåller testresultaten från aktuella och tidigare versioner av Terraform.
Se fler artiklar och exempelkod som visar hur du använder Terraform för att hantera Azure-resurser
Skapa en katalog där du kan testa Terraform-exempelkoden och göra den till den aktuella katalogen.
Skapa en fil med namnet
providers.tfoch infoga följande kod:terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } azapi = { source = "azure/azapi" version = "~>1.5" } } } provider "azurerm" { features {} }Skapa en fil med namnet
ssh.tfoch infoga följande kod: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 = azapi_resource_action.ssh_public_key_gen.output.publicKey }Skapa en fil med namnet
main.tfoch infoga följande kod:resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "random_string" "storage_account_name" { length = 8 lower = true numeric = false special = false upper = false } resource "random_password" "password" { length = 20 min_lower = 1 min_upper = 1 min_numeric = 1 min_special = 1 special = true } resource "azurerm_resource_group" "rg" { name = random_pet.rg_name.id location = var.resource_group_location } resource "azurerm_public_ip" "pip_azfw" { name = "pip-azfw" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" } resource "azurerm_storage_account" "sa" { name = random_string.storage_account_name.result resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location account_tier = "Standard" account_replication_type = "LRS" account_kind = "StorageV2" } resource "azurerm_firewall_policy" "azfw_policy" { name = "azfw-policy" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku = var.firewall_sku_tier threat_intelligence_mode = "Alert" } resource "azurerm_firewall_policy_rule_collection_group" "prcg" { name = "prcg" firewall_policy_id = azurerm_firewall_policy.azfw_policy.id priority = 300 application_rule_collection { name = "app-rule-collection-1" priority = 101 action = "Allow" rule { name = "someAppRule" protocols { type = "Https" port = 443 } destination_fqdns = ["*bing.com"] source_ip_groups = [azurerm_ip_group.ip_group_1.id] } } network_rule_collection { name = "net-rule-collection-1" priority = 200 action = "Allow" rule { name = "someNetRule" protocols = ["TCP", "UDP", "ICMP"] source_ip_groups = [azurerm_ip_group.ip_group_1.id] destination_ip_groups = [azurerm_ip_group.ip_group_2.id] destination_ports = ["90"] } } } resource "azurerm_firewall" "fw" { name = "azfw" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku_name = "AZFW_VNet" sku_tier = var.firewall_sku_tier ip_configuration { name = "azfw-ipconfig" subnet_id = azurerm_subnet.azfw_subnet.id public_ip_address_id = azurerm_public_ip.pip_azfw.id } firewall_policy_id = azurerm_firewall_policy.azfw_policy.id } resource "azurerm_ip_group" "ip_group_1" { name = "ip-group_1" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location cidrs = ["13.73.64.64/26", "13.73.208.128/25", "52.126.194.0/23"] } resource "azurerm_ip_group" "ip_group_2" { name = "ip_group_2" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location cidrs = ["12.0.0.0/24", "13.9.0.0/24"] } resource "azurerm_virtual_network" "azfw_vnet" { name = "azfw-vnet" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name address_space = ["10.10.0.0/16"] } resource "azurerm_subnet" "azfw_subnet" { name = "AzureFirewallSubnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.0.0/26"] } resource "azurerm_subnet" "server_subnet" { name = "subnet-server" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.1.0/24"] } resource "azurerm_subnet" "jump_subnet" { name = "subnet-jump" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.2.0/24"] } resource "azurerm_public_ip" "vm_jump_pip" { name = "pip-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" } resource "azurerm_network_interface" "vm_server_nic" { name = "nic-server" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig-workload" subnet_id = azurerm_subnet.server_subnet.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_network_interface" "vm_jump_nic" { name = "nic-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig-jump" subnet_id = azurerm_subnet.jump_subnet.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.vm_jump_pip.id } } resource "azurerm_network_security_group" "vm_server_nsg" { name = "nsg-server" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } resource "azurerm_network_security_group" "vm_jump_nsg" { name = "nsg-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name security_rule { name = "Allow-SSH" priority = 1000 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "22" source_address_prefix = "*" destination_address_prefix = "*" } } resource "azurerm_network_interface_security_group_association" "vm_server_nsg_association" { network_interface_id = azurerm_network_interface.vm_server_nic.id network_security_group_id = azurerm_network_security_group.vm_server_nsg.id } resource "azurerm_network_interface_security_group_association" "vm_jump_nsg_association" { network_interface_id = azurerm_network_interface.vm_jump_nic.id network_security_group_id = azurerm_network_security_group.vm_jump_nsg.id } resource "azurerm_linux_virtual_machine" "vm_server" { name = "server-vm" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location size = var.virtual_machine_size admin_username = var.admin_username admin_ssh_key { username = var.admin_username public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey } network_interface_ids = [azurerm_network_interface.vm_server_nic.id] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" } source_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "18.04-LTS" version = "latest" } boot_diagnostics { storage_account_uri = azurerm_storage_account.sa.primary_blob_endpoint } } resource "azurerm_linux_virtual_machine" "vm_jump" { name = "jump-vm" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location size = var.virtual_machine_size network_interface_ids = [azurerm_network_interface.vm_jump_nic.id] admin_username = var.admin_username os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" } admin_ssh_key { username = var.admin_username public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey } source_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "18.04-LTS" version = "latest" } boot_diagnostics { storage_account_uri = azurerm_storage_account.sa.primary_blob_endpoint } computer_name = "JumpBox" } resource "azurerm_route_table" "rt" { name = "rt-azfw-eus" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name disable_bgp_route_propagation = false route { name = "azfwDefaultRoute" address_prefix = "0.0.0.0/0" next_hop_type = "VirtualAppliance" next_hop_in_ip_address = azurerm_firewall.fw.ip_configuration[0].private_ip_address } } resource "azurerm_subnet_route_table_association" "server_subnet_rt_association" { subnet_id = azurerm_subnet.server_subnet.id route_table_id = azurerm_route_table.rt.id }Skapa en fil med namnet
variables.tfoch infoga följande kod:variable "resource_group_location" { type = string description = "Location for all resources." default = "eastus" } variable "resource_group_name_prefix" { type = string description = "Prefix for the Resource Group Name that's combined with a random id so name is unique in your Azure subcription." default = "rg" } variable "firewall_sku_tier" { type = string description = "Firewall SKU." default = "Premium" # Valid values are Standard and Premium validation { condition = contains(["Standard", "Premium"], var.firewall_sku_tier) error_message = "The SKU must be one of the following: Standard, Premium" } } variable "virtual_machine_size" { type = string description = "Size of the virtual machine." default = "Standard_D2_v3" } variable "admin_username" { type = string description = "Value of the admin username." default = "azureuser" }Skapa en fil med namnet
outputs.tfoch infoga följande kod:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "firewall_name" { value = azurerm_firewall.fw.name }
Initiera Terraform
Kör terraform init för att initiera Terraform-distributionen. Det här kommandot laddar ned den Azure-provider som krävs för att hantera dina Azure-resurser.
terraform init -upgrade
Viktiga punkter:
- Parametern
-upgradeuppgraderar nödvändiga provider-plugin-program till den senaste versionen som uppfyller konfigurationens versionsbegränsningar.
Skapa en Terraform-exekveringsplan
Kör terraform plan för att skapa en utförandeplan.
terraform plan -out main.tfplan
Viktiga punkter:
- Kommandot
terraform planskapar en utförandeplan, men utför den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om genomförandeplanen matchar dina förväntningar innan du gör några ändringar i de faktiska resurserna. - Med den valfria parametern
-outkan du ange en utdatafil för planen. Med hjälp av parametern-outser du till att den plan som du har granskat är exakt vad som tillämpas.
Tillämpa en Terraform-utförandeplan
Kör terraform apply för att tillämpa utförandeplanen på din molnbaserade infrastruktur.
terraform apply main.tfplan
Viktiga punkter:
-
terraform applyExempelkommandot förutsätter att du tidigare kördeterraform plan -out main.tfplan. - Om du har angett ett annat filnamn för parametern
-outanvänder du samma filnamn i anropet tillterraform apply. - Om du inte använde parametern
-outanropar duterraform applyutan några parametrar.
Verifiera resultatet
Hämta namnet på Azure-resursgruppen.
resource_group_name=$(terraform output -raw resource_group_name)Kör az network ip-group list för att visa de två nya IP-grupperna.
az network ip-group list --resource-group $resource_group_name
Rensa resurser
Gör följande när du inte längre behöver de resurser som skapats via Terraform:
Kör terraform plan och specificera flaggan
destroy.terraform plan -destroy -out main.destroy.tfplanViktiga punkter:
- Kommandot
terraform planskapar en utförandeplan, men utför den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om genomförandeplanen matchar dina förväntningar innan du gör några ändringar i de faktiska resurserna. - Med den valfria parametern
-outkan du ange en utdatafil för planen. Med hjälp av parametern-outser du till att den plan som du har granskat är exakt vad som tillämpas.
- Kommandot
Kör terraform apply för att tillämpa genomförandeplanen.
terraform apply main.destroy.tfplan
Felsöka Terraform i Azure
Felsöka vanliga problem när du använder Terraform i Azure