如何在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
相关产品推荐
相关产品推荐

