Terraform如何使用cidrsubnets批量生成100个及以上子网?
Terraform批量生成子网的实现方案
你可以通过Terraform的列表生成语法+参数展开运算符实现批量生成子网,无需手动逐个编写newbits参数,具体实现如下:
场景1:所有子网前缀长度一致(最常用)
如果所有子网相对于父网段的位数偏移(即newbits值)完全相同,只需指定子网总数、父网段、统一偏移量即可自动生成:
locals { # 父网段配置 parent_cidr = "10.10.0.0/18" # 自定义参数:需要生成的子网总数 required_subnet_count = 100 # 自定义参数:每个子网相对于父网段的位数偏移,示例中为9即子网前缀为/18+9=/27 newbits_per_subnet = 9 # 自动生成子网列表 subnet_list = cidrsubnets( local.parent_cidr, # 批量生成包含N个相同newbits值的列表,通过...运算符展开为cidrsubnets的可变参数 [for i in range(local.required_subnet_count) : local.newbits_per_subnet]... ) }
你可以直接通过local.subnet_list获取所有生成的子网CIDR列表。
场景2:按子网结束地址自动计算生成规模
如果你需要以指定结束地址作为生成边界,可以先通过Terraform的CIDR计算函数反推所需的子网数量:
locals { parent_cidr = "10.10.0.0/18" # 自定义参数:子网不得超过该结束地址 subnet_end_ip = "10.10.31.255" newbits_per_subnet = 9 # 计算父网段到结束地址的总可用地址数,反推可生成的子网数量 total_available_hosts = cidrhost(local.parent_cidr, 0) - cidrhost(local.subnet_end_ip, 0) + 1 subnet_host_count = pow(2, 32 - (cidrnetmask(local.parent_cidr) + local.newbits_per_subnet)) required_subnet_count = floor(local.total_available_hosts / local.subnet_host_count) subnet_list = cidrsubnets(local.parent_cidr, [for i in range(local.required_subnet_count) : local.newbits_per_subnet]...) }
注意事项
- 请提前确认父网段的容量可以支撑你需要的子网数量:例如父网段为
/18、newbits=9时,最多可生成2^9=512个/27子网,超过该数量时Terraform会抛出参数错误。 - 如果不同子网需要的
newbits值不同,只需自行构造对应的newbits列表,再通过...运算符展开传入即可,仍无需逐个手写参数。
内容的提问来源于stack exchange,提问作者Mathias Wrobel
相关产品推荐
相关产品推荐

