gpt4 book ai didi

azure - 地形循环

转载 作者:行者123 更新时间:2023-12-03 02:43:05 25 4
gpt4 key购买 nike

我目前正在编写一些 Terraform 代码,用于将 Azure 私有(private) DNS 区域部署到 Azure 中。

我已使用以下代码成功部署了 DNS 区域:

dns_zones = [
"domain1.com",
"domain2.com",
"domain3.com",
]

resource "azurerm_private_dns_zone" "dns_zones" {
for_each = toset(var.dns_zones)

name = each.value
resource_group_name = var.resource_group
}

我的问题是配置区域和虚拟网络之间的链接。我需要迭代 dns_zones 列表并有一个嵌套循环,然后迭代 vnet_links 列表并配置区域上的 vnet 链接。

以下解决方案有效,但它不是很强大,因为从任一列表中删除配置都会打乱列表的索引号,导致 Terraform 删除并重新创建配置,这不是一个选项:

vnet_links = [
{
"linkName": "name-of-vnet-link1"
"vnetId": "vnet--resource-id-placeholder1"
},{
"linkName": "name-of-vnet-link2"
"vnetId": "vnet--resource-id-placeholder2"
}
]

resource "azurerm_private_dns_zone_virtual_network_link" "vnet_link" {
count = length(setproduct(var.dns_zones, var.vnet_links))

name = element(setproduct(var.dns_zones, var.vnet_links)[count.index], 1).linkName
resource_group_name = var.resource_group
private_dns_zone_name = element(setproduct(var.dns_zones, var.vnet_links)[count.index], 0)
virtual_network_id = element(setproduct(var.dns_zones, var.vnet_links)[count.index], 1).vnetId
}

我发现使用下面的 setproduct() 函数可以创建一个包含我想要使用的数据的新列表,并且我打算将其与 for_each 而不是计数一起使用,但不可能使用这与 toset() 函数一起使用,因为它只接受字符串列表。

setproduct(var.dns_zones, var.vnet_links)

现在我有点不知该去哪里。我可以将区域信息包含在 vnet_links 列表中,但这需要大量重复,我想避免这种情况。理想情况下,我希望能够找到一种解决方案,不需要对 dns_zones 列表进行任何更改,并保留带有 vnet 链接的单独列表。

谢谢!

编辑:

感谢 Charles 提供了一种格式化数据的方法。除了 Charles 响应之外,我还需要在 for_each 循环中创建动态映射来使用数据。最终解决方案如下所示:

dns_zones = [
"domain1.com",
"domain2.com",
"domain3.com",
]

vnet_links = [
{
"linkName": "name-of-vnet-link1"
"vnetId": "vnet--resource-id-placeholder1"
},{
"linkName": "name-of-vnet-link2"
"vnetId": "vnet--resource-id-placeholder2"
}
]

locals {
association = flatten([
for dns_zone in var.dns_zones: [
for link in var.vnet_links: {
zone = dns_zone
vnet_link = link
}
]
])
}

resource "azurerm_private_dns_zone_virtual_network_link" "vnet_link" {
for_each = { for row in local.association:
"${row.zone}_${row.vnet_link.linkName}" => {
zone = row.zone
linkName = row.vnet_link.linkName
vnetId = row.vnet_link.vnetId
}
}

name = each.value.linkName
resource_group_name = var.resource_group
private_dns_zone_name = each.value.zone
virtual_network_id = each.value.vnetId
}

最佳答案

根据您的要求,我认为 for 循环适合您,我假设您希望将区域信息和 Vnet 链接关联为以下格式:

  {
"vnet_link" = {
"linkName": "name-of-vnet-link1"
"vnetId": "vnet--resource-id-placeholder1"
}
"zone" = "domain1.com"
}

然后您可以使用 for 循环将所有可能的关联放入如下列表中:

variable "dns_zones" {
default = [
"domain1.com",
"domain2.com",
"domain3.com",
]
}

variable "vnet_links" {
default = [
{
"linkName": "name-of-vnet-link1"
"vnetId": "vnet--resource-id-placeholder1"
},
{
"linkName": "name-of-vnet-link2"
"vnetId": "vnet--resource-id-placeholder2"
}
]
}

locals {
association = flatten([
for dns_zone in var.dns_zones: [
for link in var.vnet_links: {
zone = dns_zone
vnet_link = link
}
]
])
}

output "association" {
value = local.association
}

最后,输出如下:

enter image description here

如果还有其他问题,请告诉我。希望这是您想要的解决方案。

关于azure - 地形循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60138478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com