[英]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.