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

如何在Terraform中将CIDR地址段拆分给两个服务?

问题根源与解决方法

问题出在哪

你用cidrsubnets("10.162.192.64/27", 5, 5, 5)得到/32子网,核心是误解了Terraform cidrsubnets函数的参数逻辑:

  • 函数第二个及以后的参数是父CIDR前缀长度的增量值,不是目标子网的前缀长度。
  • 你的父CIDR是10.162.192.64/27(前缀长度27),传入增量5后,子网前缀长度变成27+5=32,自然得到单地址的/32子网。

另外,10.162.192.64/27本身就是一个/27子网,它无法再拆分出同前缀长度的子网——因为前缀长度相同意味着子网范围和父CIDR完全一致,没有多余地址可拆分。

正确的两种实现方式

方式一:从原CIDR一次性拆分所有子网,按需截取

最稳妥的做法是直接从初始的10.162.192.0/22拆分出全部需要的6个/27子网,再分别分配给internal和public服务:

locals {
  # 从原CIDR拆分出6个/27子网(22+5=27)
  all_subnets = cidrsubnets("10.162.192.0/22", 5, 5, 5, 5, 5, 5)
  # 取前3个给internal服务
  internal    = slice(local.all_subnets, 0, 3)
  # 取第4-6个给public服务(对应你要的96/27、128/27、160/27)
  public      = slice(local.all_subnets, 3, 6)
}

方式二:单独为public服务选择合适的父CIDR拆分

如果你想单独拆分public的子网,需要选择一个能包含目标子网的更大CIDR段作为父级,比如10.162.192.96/24(前缀长度24),传入增量3(24+3=27),就能直接得到目标子网:

locals {
  public = cidrsubnets("10.162.192.96/24", 3, 3, 3)
}

这个拆分会直接生成["10.162.192.96/27", "10.162.192.128/27", "10.162.192.160/27"],完全符合你的需求。

内容的提问来源于stack exchange,提问作者hendry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:20:28