gpt4 book ai didi

azure - 如何获取 Terraform 内标记的 Azure VNet 的事件地址空间?

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

我想使用 Terraform 获取 Terraform 中具有特定标记的 Azure VNet 的事件地址空间。为此,我认为我可以使用虚拟网络的资源数据源:

data "azurerm_resources" "vnets"{
type = "Microsoft.Network/virtualNetworks"
required_tags = {
tag_name = "tag"
}
}

然后我意识到所需的属性“address_space”实际上属于虚拟网络数据源( https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html )。我仍然需要从资源数据源获取有关现有虚拟网络的信息。所以我尝试嵌套数据源,但以下代码不起作用:

data "azurerm_virtual_network" "vnets"{
for_each = [for r in data.azurerm_resources.vnets.resources: {r.name = split("/", split("/resourceGroups", r.id))}]
name = each.key
resource_group_name = each.value
}

如果这可行,那么我们的想法就是根据当前分配的 VNet 地址 (active_vnet_addresses) 和预定义地址确定可以给予新 VNet 的最低可能 VNet 地址空间空间 (eligible_vnet_addresses) 受到 Azure 中每个订阅的资源组数量 (980=3*255+215) 的限制:

locals {
active_vnet_addresses = azurerm_virtual_network.vnets.address_space
eligible_vnet_addresses = concat([for s in range(1,255,1): "10.${s}.0.0/16"], [for s in range(1,255,1): "11.${s}.0.0/16"], [for s in range(1,255,1): "12.${s}.0.0/16"], [for s in range(1,215,1): "13.${s}.0.0/16"])
available_vnet_addresses = setsubtract(local.eligible_vnet_addresses, local.active_vnet_addresses)
available_vnet_numbers_sorted = sort([for a in local.available_vnet_addresses: split(".", a)[1]])
lowest_available_address_num = (length(local.available_vnet_numbers_sorted) == 0 ? "no more resource groups available" : local.available_vnet_numbers_sorted[0])
}

我对 Terraform 还很陌生,这是我最大的努力,因此我非常感谢有关代码改进的建议,并且如果有人能够向我指出如何在 Terraform 中从 Azure 获取已事件地址空间的解决方案,我将非常感激。

最佳答案

要使您尝试的嵌套数据源正常工作,您需要像这样更改代码:

data "azurerm_virtual_network" "vnet" {
for_each = zipmap(flatten([for id in data.azurerm_resources.vnets.resources[*].id: element(split("/", id), 4)]), data.azurerm_resources.vnets.resources[*].name)
resource_group_name = each.key
name = each.value
}

这些数据源仅获取现有 VNet 详细信息的 map 。 map 的每个元素显示如下:

"group_name" = {
"address_space" = [
"172.18.44.0/24",
]
"guid" = "7212a68b-94a0-4be9-b972-b1c61e6ec007"
"id" = "xxxxxxxxxxxxx"
"location" = "southcentralus"
"name" = "romungi-ml-studio-vnet"
"resource_group_name" = "group_name"
"subnets" = [
"default",
]
"vnet_peerings" = {}
}

所以如果只是想获取所有VNet的地址空间,则需要继续转换数据源。将详细信息转换为 map ,每个成员如下所示:

"VNet_name" = address_space

代码如下:

locals {
vnet_address_spaces = zipmap(values(data.azurerm_virtual_network.vnet)[*].name, values(data.azurerm_virtual_network.vnet)[*].address_space)
}

整个 map 显示在这里:

vnets = {
"vnet1" = [
"172.18.1.0/24",
]
"vnet2" = [
"172.17.2.0/24",
]
"vnet3" = [
"172.18.44.0/24",
]
"vnet4" = [
"10.0.0.0/16",
]
}

关于azure - 如何获取 Terraform 内标记的 Azure VNet 的事件地址空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62519071/

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