Terraform 在使用for\u创建的资源中使用for\u的动态块
我尝试在Azure中使用Terraform 0.12+及其新版本for_构建多个VNET,但遇到了一些麻烦。我希望新的功能能让我创建一个通用的网络模块,可以容纳一个复杂的变量,但我可能已经达到了它的极限,或者只是没有正确地思考它。。 基本上,我的变量是这样构建的Terraform 在使用for\u创建的资源中使用for\u的动态块,terraform,terraform0.12+,Terraform,Terraform0.12+,我尝试在Azure中使用Terraform 0.12+及其新版本for_构建多个VNET,但遇到了一些麻烦。我希望新的功能能让我创建一个通用的网络模块,可以容纳一个复杂的变量,但我可能已经达到了它的极限,或者只是没有正确地思考它。。 基本上,我的变量是这样构建的 variable "networks" { type = list(object({ name = string, newbits = number, netnum = number, subnets = list(object({
variable "networks" {
type = list(object({ name = string, newbits = number, netnum = number, subnets = list(object({ name = string, newbits = number, netnum = number}))}))
}
您可以看到它是一个网络阵列,其中包含该网络的子网子阵列。这样做可以轻松记录网络,而无需额外的地形资源需求,因此我们的网络团队可以轻松调整/扩展,而无需担心了解HCL
我可以使用count及其索引执行构建多个vnet资源的必要功能,但我希望使用for_,因为它允许索引键,而不是随着时间的推移而变化的计数(需要重新部署,我们无法做到)
网络对象
networks = [
{
# x.x.1.0/24
name = "DMZ",
newbits = "8",
netnum = "1",
subnets = [
{
# x.x.1.0/25
name = "DMZ"
newbits = "9",
netnum = "2"
}
]
},
{
# x.x.33.0/24
name = "Intermediary"
newbits = "8",
netnum = "33",
subnets = [
{
# x.x.33.0/25
name = "subnet1"
newbits = "9",
netnum = "66"
},
{
# x.x.33.128/25
name = "subnet2"
newbits = "9",
netnum = "67"
}
]
}
]
我已经尝试并成功地构建了带有for_each的VNET,方法是将对象更改为映射,然后使用each.key和each.value(为each.value执行cidrsubnet),但问题在于生成子网
locals {
vnets = {
for vnet in var.networks:
vnet.name => cidrsubnet(var.root_cidr, vnet.newbits, vnet.netnum)
}
}
因为地图上没有这些子网,所以我只是把头撞在墙上。
有人有什么建议吗?还是我真的在不需要的时候把事情弄得太复杂了
有效的资源创建,但没有子网
resource "azurerm_virtual_network" "vnets" {
for_each = local.vnets
name = each.key
address_space = [each.value]
location = azurerm_resource_group.network.location
resource_group_name = azurerm_resource_group.network.name
}
我希望我可以使用一个动态块,也许可以过滤它以匹配网络资源中的每个.key。我也尝试过用它自己的子网资源来做,但就是想不出来
这就是我希望能发挥作用的全部资源
resource "azurerm_virtual_network" "vnets" {
for_each = local.vnets
name = "99999-Nucleus-${each.key}"
address_space = [each.value]
location = azurerm_resource_group.network.location
resource_group_name = azurerm_resource_group.network.name
dynamic "subnet" {
for_each = [for vnet in var.networks:
[for s in vnet.subnets: {
name = s.name
prefix = cidrsubnet(var.root_cidr, s.newbits, s.netnum)
}] if var.networks.name == each.key]
content {
name = subnet.value.name
address_prefix = subnet.value.prefix
}
}
}
在这里构建这个中间的
local.vnets
映射会使这个问题更难解决,因为它会丢弃这些对象中的所有其他信息,从而使资源“azurerm\u虚拟网络”“vnets”块中的其他信息难以使用
相反,如果我们在原始var.networks
值上使用重复,那么我们可以从每个.value内部直接获得子网
列表:
resource "azurerm_virtual_network" "vnets" {
for_each = { for n in var.networks : n.name => n }
location = azurerm_resource_group.network.location
resource_group_name = azurerm_resource_group.network.name
name = "99999-Nucleus-${each.key}"
address_space = [cidrsubnet(var.root_cidr, each.value.newbits, each.value.netnum)]
dynamic "subnet" {
for_each = each.value.subnets
content {
name = subnet.value.name
address_prefix = cidrsubnet(var.root_cidr, subnet.value.newbits, subnet.value.netnum)
}
}
}
好极了谢谢这个。。。完全可以工作,我可以看到我的大脑没有工作的地方。