如何使用分配了静态 IP 地址的 Terraform 在循环中创建多个虚拟机网卡

How to create multiple vm nics in a loop using terraform with static ipaddress assigned

我正在尝试使用 Terraform 在 Azure 中创建 2 个 VM,每个 VM 需要 4 个网卡,vnet 的每个子网中各一个,并且这些网卡必须配置静态 IP 地址。有什么方法可以通过 for_each?

理想地使用循环来完成此操作

我可以通过 'dynamic' 为 ip_configuration 块分配 IP 地址来做到这一点,没有问题,但需要它与 'static' IP 分配一起使用,并且不知道如何通过网络接口资源块 ip_configuration 块内的 IP 地址。

我不知道动态块是否适合这里的模型,但我尝试将嵌套循环与动态 ip_configuration 块一起使用,但运气不佳:-(

这是我目前所拥有的(子网 1 的网卡片段),希望得到一些帮助;

variable "subnet1IpAddresses" {
  type        = map(string)
  description = "The subnet1 IP address to assign to vm nodes."
  default = {
    "1" = "10.10.1.4"  
    "2" = "10.10.1.5"
  }
}

locals {
  vmName = [format("%s%s%s%s%s", var.envPrefix, "-", var.dptPrefix, var.vmPrefix, "01"), format("%s%s%s%s%s", var.envPrefix, "-", var.dptPrefix, var.vmPrefix, "02")]
  subnet1Ip = [var.subnet1IpAddresses[1], var.subnet1IpAddresses[2]] 
}

#create NIC for each NVA and Assign Static IP addresses.
    resource "azurerm_network_interface" "subnet1Nics" {
      for_each                      = toset(local.vmName)
      name                          = "${each.value}subnet1-nic"
      resource_group_name           = azurerm_resource_group.rg.name
      location                      = azurerm_resource_group.rg.location
      enable_ip_forwarding          = "true"
      enable_accelerated_networking = "true"
    
      dynamic ip_configuration {
        for_each = local.subnet1Ip
        content {
          name                          = "ipconfig1"
          subnet_id                     = azurerm_subnet.snet1.id
          private_ip_address            = ip_configuration.value
          private_ip_address_allocation = "static"
          primary                       = "true"
        }
      }
    }

上述代码 'as-is' 的问题在于它尝试为同一个虚拟机创建两个 ip_configuration,因此虚拟机 1 将具有具有两个 IP 配置的 nic1,即(10.10.1.4 和 10.10。 1.5) 但这不是我需要的。

简而言之,下面是我对这个具体示例的期望结果,希望有人能提供帮助。

VM1's nic1 with IP (10.10.1.4)
VM2's nic1 with IP (10.10.1.5)

谢谢。

这里举个例子供你参考:2个VM,每个VM有4个NIC,VNet中有4个子网,VM的每个NIC在一个子网中。

main.tf:

provider "azurerm" {
  features {}
}

variable "nics" {}

variable "vnet_prefix" {}

variable "subnet_prefixes" {}

resource "azurerm_resource_group" "group" {
  name              = "charlesVM"
  location          = "East Asia" 
}

resource "azurerm_virtual_network" "vnet" {
  name              = "charles-vnet"
  resource_group_name = azurerm_resource_group.group.name
  location          = azurerm_resource_group.group.location
  address_space     = var.vnet_prefix
}

resource "azurerm_subnet" "subnets" {
  count             = length(var.subnet_prefixes)
  name              = "subnet-${count.index}"
  resource_group_name = azurerm_resource_group.group.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefix    = element(var.subnet_prefixes, count.index)
}

resource "azurerm_network_interface" "nics" {
  count             = length(var.nics)
  name              = "nic-${count.index}"
  location          = azurerm_resource_group.group.location
  resource_group_name = azurerm_resource_group.group.name

  ip_configuration {
    name            = "config-${count.index}"
    subnet_id       = element(azurerm_subnet.subnets[*].id, count.index % 4)
    private_ip_address_allocation = "Static"
    private_ip_address = element(var.nics, count.index)
  }
}

locals {
  vm_nics = chunklist(azurerm_network_interface.nics[*].id, 4)
}

resource "azurerm_linux_virtual_machine" "vm" {
  count             = 2
  name              = "azurevm-${count.index}"
  resource_group_name = azurerm_resource_group.group.name
  location          = azurerm_resource_group.group.location
  size              = "Standard_DS3_v2"
  admin_username    = "adminuser"
  network_interface_ids = element(local.vm_nics, count.index)

  admin_ssh_key {
    username   = "adminuser"
    public_key = file("~/.ssh/id_rsa.pub")
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }
}

terraform.tfvar:

nics = [
    "10.0.0.4",
    "10.0.1.4",
    "10.0.2.4",
    "10.0.3.4",
    "10.0.0.5",
    "10.0.1.5",
    "10.0.2.5",
    "10.0.3.5"
]
vnet_prefix = ["10.0.0.0/16"]
subnet_prefixes = [
    "10.0.0.0/24",
    "10.0.1.0/24",
    "10.0.2.0/24",
    "10.0.3.0/24"
]

注意,如果要使用静态IP地址,则需要手动计算避免冲突,并确保网卡的每个IP地址都在子网内。并且您还需要选择合适的 VM 大小,一个 VM 可以支持 4 个 NIC。