【发布时间】:2020-11-20 02:12:03
【问题描述】:
我想为 AWS 区域内的子网提供这样的地址:
10.0.0.0/21
10.0.8.0/21
10.0.16.0/21
10.0.24.0/21
10.0.32.0/21
...
基本上,将第二个数字增加 8。
我还将为每个区域提供一个 VPN,它们应该共享同一个网络。所以我希望他们是这样的:
10.1.0.0/16
10.2.0.0/16
10.3.0.0/16
10.4.0.0/16
10.5.0.0/16
...
基本上每次将第 3 个数字加 1。如果不可能每步走 1 步,那么也可以走 8 步。
我有read in depth about CIDR blocks,但仍然不太清楚如何申请,特别是在以下情况下。
我想要一套以 1 个 CIDR 块开头的嵌套 Terraform 模块,并将其子网化为越来越小的块。首先,它将按区域(第 3 个数字)细分,然后按可用区(第 2 个数字)细分。一切都是动态的,因此您只需按字面意思提供初始 CIDR 块。
看来我应该用cidrsubnet:
cidrsubnet(prefix, newbits, netnum)
我得到了这样的结果:
cidrsubnet(var.cidr_block, 13, netnum?)
我知道13 将从/8 变为/21。但这直接进入了可用区(我不知道如何处理netnum)。我想做这样的事情:
# main.tf
variable "cidr_block" {
default = "10.0.0.0/8"
}
module "region1" {
source = "./region" # ./region/main.tf
cidr_block = cidrsubnet(var.cidr_block, 8?, count.index?) # 10.0.0.0/16?
}
module "region2" {
source = "./region" # ./region/main.tf
cidr_block = cidrsubnet(var.cidr_block, 8?, count.index?) # 10.1.0.0/16?
}
// ...
然后在区域子模块中:
# region/main.tf
module "availability_zone1" {
source = "./availability_zone" # ./availability_zone/main.tf
cidr_block = cidrsubnet(var.cidr_block, 5?, count.index?) # 10.1.0.0/21
}
module "availability_zone2" {
source = "./availability_zone" # ./availability_zone/main.tf
cidr_block = cidrsubnet(var.cidr_block, 5?, count.index?) # 10.1.8.0/21
}
module "availability_zone3" {
source = "./availability_zone" # ./availability_zone/main.tf
cidr_block = cidrsubnet(var.cidr_block, 5?, count.index?) # 10.1.16.0/21
}
// ...
所以基本上,从/8 -> /16 细分一次,然后再从/16 -> /21 细分一次。 count.index 我还没有使用过,但不知何故我想让它知道它在调用序列中的位置。如果不可能,那很好,我可以将索引与模块一起传递。
如何使用cidrsubnet 函数编写此代码?问题中最重要的部分是我应该在函数的每个插槽中放入什么:cidrsubnet(prefix, newbits, netnum),我不知道具体netnum应该是什么样的。
【问题讨论】:
标签: networking terraform ip-address subnet cidr