簡體   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