如何使用 for_each 将值从一个模块列表传递到另一个模块

How to pass values from one's module list to another module with for_each

我有一个创建 vnet 和子网的模块(vnet 模块):

resource "azurerm_virtual_network" "xxx" {
  count               = length(var.vnets)
  name                = var.vnets[count.index].vnet_name
  address_space       = var.vnets[count.index].address_space
  location            = var.resource_location
  resource_group_name = var.resource_group_name

  dynamic "subnet" {
    for_each = var.vnets[count.index].subnets

    content {
      name           = subnet.value.name
      address_prefix = subnet.value.address
      security_group = azurerm_network_security_group.xxx.id
    }
  }

  tags = var.tags

}

var.vnets 是

vnets = [
  {
    vnet_name     = "01-vnet"
    address_space = ["10.0.0.0/23"]
    subnets = [
      {
        name    = "workloads-01"
        address = "10.0.0.0/24"
      }
    ]
  },
  {
    vnet_name     = "02-vnet"
    address_space = ["10.0.2.0/23"]
    subnets = [
      {
        name    = "workloads-02"
        address = "10.0.2.0/24"
      }
    ]
  }
]

然后我将子网传递到我的根文件

output "subnets" {
  value = flatten(azurerm_virtual_network.xxx[*].subnet[*].id)

}

结果输出

Outputs:

subnets = [
  "/subscriptions/XXX/resourceGroups/EIS/providers/Microsoft.Network/virtualNetworks/eis-01-vnet/subnets/eis-workloads-01",
  "/subscriptions/XXX/resourceGroups/EIS/providers/Microsoft.Network/virtualNetworks/eis-02-vnet/subnets/eis-workloads-02",
]

现在我想在另一个模块(vm 模块)中创建 VM 时使用这些子网:

resource "azurerm_network_interface" "nics" {
  for_each            = var.vms
  name                = "${each.value.name}-nic"
  location            = var.resource_location
  resource_group_name = var.resource_group_name

  ip_configuration {
    name                          = "iface-${each.value.name}"
    subnet_id                     = element(var.subnet_id, count.index)
    private_ip_address_allocation = "Dynamic"
  }

  tags = var.tags

}

哪里var.vms

vms = {
  vm1 = {
    name      = "vm1"
    vm_size   = "Standard_B1ms"
    username  = "centos"
    password  = "222!"
    disk_size = "30"
    sku       = "7_9"
    ext_ip    = "1"
  },
  vm2 = {
    name      = "vm2"
    vm_size   = "Standard_B1ls"
    username  = "centos"
    password  = "111!"
    disk_size = "35"
    sku       = "7_9"
    ext_ip    = ""
  }
}

而var.subnet_id只是,定义在vm模块中。

variable "subnet_id" {}

我的根main.tf

module "vm" {
  source = "./modules/vm"
  for_each = var.vms

  vms                 = var.vms
  publicip_name       = var.publicip_name
  subnet_id           = module.vnet.subnets[*]
  resource_group_name = azurerm_resource_group.xxx.name
  resource_location   = azurerm_resource_group.xxx.location

  tags = local.common_tags
}

如何将 subnet_ids 从模块 vnet 传递到模块 vm,以便资源“azurerm_network_interface”将为 vms 中定义的每个键使用一个 subnet_ids?

我会使用“element(var.subnet_id, count.index)”进行计数,但是如何为将使用 for_each 创建的资源传递这些子网 ID?

您可以使用索引遍历 var.vms,如下所示:

resource "azurerm_network_interface" "nics" {
  for_each            = {for idx, vm in keys(var.vms): idx => var.vms[vm]}
  name                = "${each.value.name}-nic"
  location            = var.resource_location
  resource_group_name = var.resource_group_name

  ip_configuration {
    name                          = "eis-iface-${each.value.name}"
    subnet_id                     = element(var.subnet_id, each.key)
    private_ip_address_allocation = "Dynamic"
  }

  tags = var.tags

}

注:keysreturns地图按键按字母顺序排列,如米。