繁体   English   中英

在模块中使用 for_each 引用属性并在资源中计数

[英]Referencing properties with for_each in modules and count in the resource

这是我的缩短代码:

variable.tf

variable "vm_avd" {
  type = map(any)
  default = {
    avd-std = {
      vm_count = "2"
      ### Interface Vars
      subnet_id = "AD"
    }
    avd-gpu = {
      vm_count = "2"
      ### Interface Vars
      subnet_id = "AD"
    }
  }
}

variable "vm_server" {
  type = map(any)
  default = {
    srv-std = {
      vm_count = "2"
      ### Interface Vars
      subnet_id = "AD"
    }
  }
}

if.tf

resource "azurerm_network_interface" "if" {
  count               = var.vm_count
  name                = var.private_ip_address_allocation == "Static" ? "if_${var.if_name}_${replace(var.private_ip_address, ".", "")}_${format("%02d", count.index)}" : "if_${var.if_name}_${format("%02d", count.index)}"
  location            = var.location
  resource_group_name = var.resource_group_name

  ip_configuration {
    name                          = "if_ipconfig"
    subnet_id                     = var.subnet_id
    private_ip_address_version    = var.private_ip_address_version
    private_ip_address_allocation = var.private_ip_address_allocation
    private_ip_address            = var.private_ip_address
  }
}
output "if_name" {
  value = azurerm_network_interface.if[*].name
}
output "if_id" {
  value = azurerm_network_interface.if[*].id
}

main.tf

module "vm" {
  for_each              = merge(var.vm_server, var.vm_avd)
  vm_name               = each.key
  vm_count              = each.value["vm_count"]
  network_interface_ids = module.if[each.key].if_id
}

module "if" {
  for_each  = merge(var.vm_server, var.vm_avd)
  vm_count  = each.value["vm_count"]
  if_name   = each.key
  subnet_id = module.snet[each.value["subnet_id"]].snet_id
}

是否有可能在for_each循环中引用依赖资源的正确count object?

我正在为 Azure 创建 Terraform 模块,我想构建一个高度灵活且易于填充的结构。

因此,我为每个资源构建了一个带有单个模块调用的根文件,并且我有一个主变量文件,该文件应填充循环遍历的值。

所有相关的资源变量都在相同的变量 object 中定义,因此对于 VM,将创建一个变量 VM 并填充 VM 详细信息、NIC 详细信息和扩展详细信息。 单个模块通过 VM、NIC 和扩展的相同变量运行,通常运行良好。

我可以很好地引用 .network 接口的su.net_id ,但是一旦我在资源中使用count运算符,我就不知道如何正确获取正确 VM 的正确接口的 .network 接口 ID。

现在我遇到了在我的模块调用中使用 for_each 的问题,我也想在我的资源定义中选择使用 count。 它正在工作,但是当我构建例如虚拟机时,我遇到了无法引用正确的网络接口的问题。 Atm 我的所有接口都连接到同一个虚拟机,无法构建第二个虚拟机。 扩展和任何可能的多个对象也是如此。

我尝试了几个模块调用,但第一个 VM 每次都获得了所有接口。 我尝试在 NIC 模块调用中使用 Star 字符或使用 .network 接口 ID。 如果这根本不可能,我想到了一个解决方案,即使用其原始形式构建 .network 接口 ID 本身。

我还检查了是否有可能用for_each和 count 元素构建一个数组,但我找不到任何方法来构建 arrays terraform 中的数字变量,就像正常的“for 1 to 5 do”一样。 如果您知道任何方法可以做到这一点,我也将不胜感激。

当您尝试简化问题时,这可能是一个错字,但在您的变量中您有:

variable vm_avd { default = { avd-std = {...}} }
variable vm_server { default = { avd-std = {...}} }

在您的主要 tf 中,您有:

merge(var.vm_server, var.vm_avd)

由于密钥相同,一个将覆盖另一个,如果您使用默认值,则可能会导致您建议的行为,考虑将密钥名称更改为 server-std?

我通过简单地将整个元素数组(例如从 VM)提供给 ID 的变量并使用计数索引引用正确的 VM 来获得解决方案:

virtual_machine_id = var.vm_id[count.index]

当我在其他资源中运行相同的计数时,我得到了引用元素的正确顺序:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM