自动分配 IP 地址范围序列的一种方法是使用 Terraform 注册表中的 the hashicorp/subnets/cidr module:
module "subnet_addrs" {
source = "hashicorp/subnets/cidr"
version = "1.0.0"
base_cidr_block = "10.90.46.0/24"
networks = [
{ name = "us-east-1a", new_bits = 3 },
{ name = "us-east-1b", new_bits = 3 },
{ name = "us-east-1c", new_bits = 3 },
{ name = "us-east-1d", new_bits = 3 },
{ name = "us-east-1e", new_bits = 3 },
{ name = "us-east-1f", new_bits = 3 },
{ name = "us-east-1g", new_bits = 3 },
{ name = "us-east-1h", new_bits = 3 },
]
}
对于上面的例子,module.subnet_addrs.network_cidr_blocks 将是这样的地图:
{
"us-east-1a" = "10.90.46.0/27"
"us-east-1b" = "10.90.46.32/27"
"us-east-1c" = "10.90.46.64/27"
"us-east-1d" = "10.90.46.96/27"
"us-east-1e" = "10.90.46.128/27"
"us-east-1f" = "10.90.46.160/27"
"us-east-1g" = "10.90.46.192/27"
"us-east-1h" = "10.90.46.224/27"
}
这样的映射可以直接用作资源的for_each,因此我们可以像这样声明子网,以AWS为例(因为您没有说明您使用的是哪个云供应商):
resource "aws_subnet" "my_subnets" {
for_each = module.subnet_addrs.network_cidr_blocks
vpc_id = var.vpc_id
availability_zone = each.key
cidr_block = each.value
}
本模块的自述文件中有一些关于 [如果您打算rename or renumber networks later 时要记住的事情,以确保您所做的更改与已经存在的对象兼容。我建议您在采用此方法之前查看该文档,以确保您能够将任何未来更改应用到您可能想象的未来网络拓扑结构中。
例如,上面示例中的分配已经覆盖了整个寻址空间"10.90.46.0/24",因此如果您以后想添加一个新子网而不引入任何新的寻址空间,则需要替换其中一个现有子网有一对替换子网,它们都具有new_bits = 4,因此前缀长度为/28,而不是/27,这样您就有一个额外的位可用于网络编号。