You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:03:14