Поделиться через


Создание устройства виртуальной сети концентратора в Azure с помощью Terraform

Terraform поддерживает определение, предварительный просмотр и развертывание облачной инфраструктуры. С помощью Terraform можно создавать файлы конфигурации с применением синтаксиса HCL. Синтаксис HCL позволяет указать поставщика облачных служб, например Azure, и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации создается план выполнения, который позволяет предварительно просматривать изменения инфраструктуры до их развертывания. После проверки изменений примените план выполнения для развертывания инфраструктуры.

VPN-устройство предоставляет возможность внешнего подключения к локальной сети. В качестве VPN-устройства может использоваться аппаратное устройство или программное решение. Один из примеров программного решения — это служба маршрутизации и удаленного доступа (RRAS) в Windows Server 2012. Дополнительные сведения о VPN-устройствах см. в статье VPN-устройства и параметры IPsec/IKE для подключений типа "сеть — сеть" через VPN-шлюз.

Azure поддерживает большое количество виртуальных сетевых устройств. В этой статье используется образ Ubuntu. Дополнительные сведения о поддерживаемых в Azure сетевых устройствах см. на этой домашней странице.

Вы узнаете, как выполнять следующие задачи:

  • реализация виртуальной сети концентратора в звездообразной топологии;
  • создание виртуальной машины сети-концентратора, которая выступает как устройство;
  • включение маршрутов с использованием расширений CustomScript;
  • создание таблицы маршрутов шлюзов со звездообразной топологией.

1. Настройка среды

2. Реализация кода Terraform

  1. Сделайте пример каталога, который вы создавали по инструкции в первой статье этой серии, текущим каталогом.

  2. Создайте файл с именем hub-nva.tf и вставьте следующий код:

    locals {
      prefix-hub-nva         = "hub-nva"
      hub-nva-location       = "eastus"
      hub-nva-resource-group = "hub-nva-rg"
    }
    
    resource "random_string" "suffix" {
      length  = 5
      special = false
      upper   = false
    }
    
    resource "azurerm_resource_group" "hub-nva-rg" {
      name     = "${local.prefix-hub-nva}-rg-${random_string.suffix.result}"
      location = local.hub-nva-location
    
      tags = {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_network_interface" "hub-nva-nic" {
      name                 = "${local.prefix-hub-nva}-nic"
      location             = azurerm_resource_group.hub-nva-rg.location
      resource_group_name  = azurerm_resource_group.hub-nva-rg.name
      enable_ip_forwarding = true
    
      ip_configuration {
        name                          = local.prefix-hub-nva
        subnet_id                     = azurerm_subnet.hub-dmz.id
        private_ip_address_allocation = "Static"
        private_ip_address            = "10.0.0.36"
      }
    
      tags = {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_virtual_machine" "hub-nva-vm" {
      name                  = "${local.prefix-hub-nva}-vm"
      location              = azurerm_resource_group.hub-nva-rg.location
      resource_group_name   = azurerm_resource_group.hub-nva-rg.name
      network_interface_ids = [azurerm_network_interface.hub-nva-nic.id]
      vm_size               = var.vmsize
    
      storage_image_reference {
        publisher = "Canonical"
        offer     = "UbuntuServer"
        sku       = "16.04-LTS"
        version   = "latest"
      }
    
      storage_os_disk {
        name              = "myosdisk1"
        caching           = "ReadWrite"
        create_option     = "FromImage"
        managed_disk_type = "Standard_LRS"
      }
    
      os_profile {
        computer_name  = "${local.prefix-hub-nva}-vm"
        admin_username = var.username
        admin_password = local.password
      }
    
      os_profile_linux_config {
        disable_password_authentication = false
      }
    
      tags = {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_virtual_machine_extension" "enable-routes" {
      name                 = "enable-iptables-routes"
      virtual_machine_id   = azurerm_virtual_machine.hub-nva-vm.id
      publisher            = "Microsoft.Azure.Extensions"
      type                 = "CustomScript"
      type_handler_version = "2.0"
    
    
      settings = <<SETTINGS
        {
            "fileUris": [
            "https://raw.githubusercontent.com/lonegunmanb/reference-architectures/refs/heads/master/scripts/linux/enable-ip-forwarding.sh"
            ],
            "commandToExecute": "bash enable-ip-forwarding.sh"
        }
    SETTINGS
    
      tags = {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_route_table" "hub-gateway-rt" {
      name                          = "hub-gateway-rt"
      location                      = azurerm_resource_group.hub-nva-rg.location
      resource_group_name           = azurerm_resource_group.hub-nva-rg.name
      disable_bgp_route_propagation = false
    
      route {
        name           = "toHub"
        address_prefix = "10.0.0.0/16"
        next_hop_type  = "VnetLocal"
      }
    
      route {
        name                   = "toSpoke1"
        address_prefix         = "10.1.0.0/16"
        next_hop_type          = "VirtualAppliance"
        next_hop_in_ip_address = "10.0.0.36"
      }
    
      route {
        name                   = "toSpoke2"
        address_prefix         = "10.2.0.0/16"
        next_hop_type          = "VirtualAppliance"
        next_hop_in_ip_address = "10.0.0.36"
      }
    
      tags = {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_subnet_route_table_association" "hub-gateway-rt-hub-vnet-gateway-subnet" {
      subnet_id      = azurerm_subnet.hub-gateway-subnet.id
      route_table_id = azurerm_route_table.hub-gateway-rt.id
      depends_on     = [azurerm_subnet.hub-gateway-subnet]
    }
    
    resource "azurerm_route_table" "spoke1-rt" {
      name                          = "spoke1-rt"
      location                      = azurerm_resource_group.hub-nva-rg.location
      resource_group_name           = azurerm_resource_group.hub-nva-rg.name
      disable_bgp_route_propagation = false
    
      route {
        name                   = "toSpoke2"
        address_prefix         = "10.2.0.0/16"
        next_hop_type          = "VirtualAppliance"
        next_hop_in_ip_address = "10.0.0.36"
      }
    
      route {
        name           = "default"
        address_prefix = "0.0.0.0/0"
        next_hop_type  = "VnetLocal"
      }
    
      tags = {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_subnet_route_table_association" "spoke1-rt-spoke1-vnet-mgmt" {
      subnet_id      = azurerm_subnet.spoke1-mgmt.id
      route_table_id = azurerm_route_table.spoke1-rt.id
      depends_on     = [azurerm_subnet.spoke1-mgmt]
    }
    
    resource "azurerm_subnet_route_table_association" "spoke1-rt-spoke1-vnet-workload" {
      subnet_id      = azurerm_subnet.spoke1-workload.id
      route_table_id = azurerm_route_table.spoke1-rt.id
      depends_on     = [azurerm_subnet.spoke1-workload]
    }
    
    resource "azurerm_route_table" "spoke2-rt" {
      name                          = "spoke2-rt"
      location                      = azurerm_resource_group.hub-nva-rg.location
      resource_group_name           = azurerm_resource_group.hub-nva-rg.name
      disable_bgp_route_propagation = false
    
      route {
        name                   = "toSpoke1"
        address_prefix         = "10.1.0.0/16"
        next_hop_in_ip_address = "10.0.0.36"
        next_hop_type          = "VirtualAppliance"
      }
    
      route {
        name           = "default"
        address_prefix = "0.0.0.0/0"
        next_hop_type  = "VnetLocal"
      }
    
      tags = {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_subnet_route_table_association" "spoke2-rt-spoke2-vnet-mgmt" {
      subnet_id      = azurerm_subnet.spoke2-mgmt.id
      route_table_id = azurerm_route_table.spoke2-rt.id
      depends_on     = [azurerm_subnet.spoke2-mgmt]
    }
    
    resource "azurerm_subnet_route_table_association" "spoke2-rt-spoke2-vnet-workload" {
      subnet_id      = azurerm_subnet.spoke2-workload.id
      route_table_id = azurerm_route_table.spoke2-rt.id
      depends_on     = [azurerm_subnet.spoke2-workload]
    }
    

Устранение неполадок с Terraform в Azure

Устранение распространенных проблем при использовании Terraform в Azure

Следующие шаги