Terraform:按索引正确命名Azure子网(0-9为sne0X,10+为sneXX)
问题:Terraform子网命名格式不符合预期
需要按索引为子网命名:
- 索引0-9:命名为
sne00至sne09 - 索引≥10:命名为
sne10、sne11等
但当前Terraform代码生成的第10个子网名称为sne010,不符合预期。
现有代码
resource "azurerm_subnet" "terra_sne" { count = "11" # Here, there is the problem name = count.index == contains(range(1, 11), "") ? "sne${count.index}" : "sne0${count.index}" resource_group_name = azurerm_resource_group.terra_rgo.name virtual_network_name = azurerm_virtual_network.terra_vne.name address_prefixes = [ "172.${var.vnet_octet}.${count.index}.0/24" ] service_endpoints = element(local.subnet_endpoints, count.index) dynamic "delegation" { for_each = count.index == 8 ? [1] : [] content { name = "aks-delegation" service_delegation { name = "Microsoft.ContainerService/managedClusters" actions = ["Microsoft.Network/virtualNetworks/subnets/join/action"] } } } }
Terraform Plan错误输出
# azurerm_subnet.terra_sne[10] will be created + resource "azurerm_subnet" "terra_sne" { + address_prefixes = [ + "172.28.10.0/24", ] + enforce_private_link_endpoint_network_policies = (known after apply) + enforce_private_link_service_network_policies = (known after apply) + id = (known after apply) + name = "sne010" + private_endpoint_network_policies_enabled = (known after apply) + private_link_service_network_policies_enabled = (known after apply) + resource_group_name = "rgo01" + service_endpoints = [ + "Microsoft.Storage", ] + virtual_network_name = "vne01" }
解决方案
问题根源
原代码中的条件判断逻辑完全错误:contains(range(1, 11), "") 永远返回false(range(1,11)生成的是[1,2,...,10]的列表,不可能包含空字符串),导致所有索引都会走sne0${count.index}分支,索引10就会生成sne010。
修正方案
方案1:使用format函数(推荐)
用%02d格式符自动将数字补为两位,不足两位时前面补零,写法简洁且不易出错:
name = format("sne%02d", count.index)
方案2:条件判断
如果需要自定义不同分支规则,可以用明确的条件判断:
name = count.index >= 10 ? "sne${count.index}" : "sne0${count.index}"
替换原代码中name行后,重新执行terraform plan即可看到正确命名:索引0-9为sne00-sne09,索引10为sne10,完全符合预期。
内容的提问来源于stack exchange,提问作者Cookies
相关产品推荐
相关产品推荐

