Dav*_*els 2 subnet amazon-web-services terraform
我正在尝试使用 Terraform 支持的 cidrsubnet 函数创建两个子网。我的 VPC cidr 是“10.32.0.0/16”。我正在尝试拥有子网 10.32.1.0/27 和 10.32.3.0/27。为了实现此目的,我在获取 cidrsubnet 函数时遇到了一些麻烦。到目前为止我所拥有的是:
cidrsubnet(10.32.0.0/16, 11, netnum???)
Run Code Online (Sandbox Code Playgroud)
我不明白 netnum 需要什么值才能获得我想要的值。对这部分功能的任何解释都会有所帮助。我尝试阅读有关此功能的文档,但它似乎有限。
文档部分“网络掩码和子网”尝试提供足够的信息来理解此函数与 IP 地址约定的关系,并提到 Unix 命令ipcalc作为可视化 CIDR 网络掩码表示方式的方法。
让我们看看如何ipcalc描述您的起始前缀和两个预期子网前缀:
$ ipcalc 10.32.0.0/16
Address: 10.32.0.0 00001010.00100000. 00000000.00000000
Netmask: 255.255.0.0 = 16 11111111.11111111. 00000000.00000000
Wildcard: 0.0.255.255 00000000.00000000. 11111111.11111111
=>
Network: 10.32.0.0/16 00001010.00100000. 00000000.00000000
HostMin: 10.32.0.1 00001010.00100000. 00000000.00000001
HostMax: 10.32.255.254 00001010.00100000. 11111111.11111110
Broadcast: 10.32.255.255 00001010.00100000. 11111111.11111111
Hosts/Net: 65534 Class A, Private Internet
$ ipcalc 10.32.1.0/27
Address: 10.32.1.0 00001010.00100000.00000001.000 00000
Netmask: 255.255.255.224 = 27 11111111.11111111.11111111.111 00000
Wildcard: 0.0.0.31 00000000.00000000.00000000.000 11111
=>
Network: 10.32.1.0/27 00001010.00100000.00000001.000 00000
HostMin: 10.32.1.1 00001010.00100000.00000001.000 00001
HostMax: 10.32.1.30 00001010.00100000.00000001.000 11110
Broadcast: 10.32.1.31 00001010.00100000.00000001.000 11111
Hosts/Net: 30 Class A, Private Internet
$ ipcalc 10.32.3.0/27
Address: 10.32.3.0 00001010.00100000.00000011.000 00000
Netmask: 255.255.255.224 = 27 11111111.11111111.11111111.111 00000
Wildcard: 0.0.0.31 00000000.00000000.00000000.000 11111
=>
Network: 10.32.3.0/27 00001010.00100000.00000011.000 00000
HostMin: 10.32.3.1 00001010.00100000.00000011.000 00001
HostMax: 10.32.3.30 00001010.00100000.00000011.000 11110
Broadcast: 10.32.3.31 00001010.00100000.00000011.000 11111
Hosts/Net: 30 Class A, Private Internet
Run Code Online (Sandbox Code Playgroud)
在ipcalc二进制表示法中,空格表示地址的网络部分和主机部分之间的边界。我们可以看到,正如您在示例中所示,两个所需结果的网络部分比基地址多了 11 位。
让我们仅使用其中之一作为示例来弄清楚“netnum”是什么。我们将使用10.32.1.0/27,并将基地址和子网地址中的“地址”行放在一起,以便我们可以更清楚地看到差异:
Address: 10.32.0.0 00001010.00100000. 00000000.00000000
Address: 10.32.1.0 00001010.00100000.00000001.000 00000
Run Code Online (Sandbox Code Playgroud)
的值netnum是在第二种情况下由这十一个附加二进制数字表示的数字:00000001000。该二进制数的十进制等效值是 8,因此netnum这个数字的 是 8,我们可以通过cidrsubnet从terraform console提示符中调用来确认这一点:
> cidrsubnet("10.32.0.0/16", 11, 8)
"10.32.1.0/27"
Run Code Online (Sandbox Code Playgroud)
为了概括这一点,请注意,在上面的二进制表示中,IP 地址中的第三个十进制数字仅代表网络号的一部分:我们00000001.000可以看到有三个二进制数字属于第四个八位字节。因为第四个二进制位代表八位的数量,所以一般规则是,要找到netnum将为第三个八位位组提供特定值的 ,您需要将该值乘以八。三乘八等于 24,所以如果我们设置netnum为 24,那么我们将得到您想要的其他前缀:
> cidrsubnet("10.32.0.0/16", 11, 24)
"10.32.3.0/27"
Run Code Online (Sandbox Code Playgroud)
话虽如此,值得注意的是,这种特定的寻址方案“浪费”了部分地址空间。如果您将最后三位始终设置为零,那么实际上您只有八位网络编号,因此只能拥有 256 个网络。如果您想利用网络编号空间的所有 11 位(2,048 个网络),您需要从零开始网络编号,并从那里正常向上计数,这将密集地占用您的所有网络空间:
> cidrsubnet("10.32.0.0/16", 11, 0)
"10.32.0.0/27"
> cidrsubnet("10.32.0.0/16", 11, 1)
"10.32.0.32/27"
> cidrsubnet("10.32.0.0/16", 11, 2)
"10.32.0.64/27"
> cidrsubnet("10.32.0.0/16", 11, 3)
"10.32.0.96/27"
> cidrsubnet("10.32.0.0/16", 11, 4)
"10.32.0.128/27"
> cidrsubnet("10.32.0.0/16", 11, 5)
"10.32.0.160/27"
> cidrsubnet("10.32.0.0/16", 11, 6)
"10.32.0.192/27"
> cidrsubnet("10.32.0.0/16", 11, 7)
"10.32.0.224/27"
> cidrsubnet("10.32.0.0/16", 11, 8)
"10.32.1.0/27"
Run Code Online (Sandbox Code Playgroud)
因为传统的 IP 地址表示法是从 0 到 255 的四个十进制数字,所以上面的计数可能看起来违反直觉,但在底层二进制表示法中,这只是从零开始的正常计数,这避免了跳过网络号 0 到 7, 9 到 15 等
如果您正在为一组子网创建系统网络寻址计划,每个子网都有特定的已识别用途,您可能会发现使用模块提供hashicorp/subnets/cidr的更高级别的抽象很有帮助,该抽象只需要用于编号的位数每个网络并netnum自行计算合适的值:
module "subnets" {
source = "hashicorp/subnets/cidr"
version = "1.0.0"
base_cidr_block = "10.32.0.0/16"
networks = [
{
name = "first",
new_bits = 11
},
{
name = "second",
new_bits = 11
},
]
}
Run Code Online (Sandbox Code Playgroud)
上面将生成network_cidr_blocks这样的地图:
{
first = "10.32.0.0/27"
second = "10.32.0.32/27"
}
Run Code Online (Sandbox Code Playgroud)
在配置的其他地方,您可以写入module.subnets.network_cidr_blocks.first以获取第一个地址。假设您选择有意义的名称而不是我设计的“第一”和“第二”,这将使您的配置的其余部分更易于阅读,因为未来的读者不需要记住每个 IP 地址范围代表的内容。
| 归档时间: |
|
| 查看次数: |
2319 次 |
| 最近记录: |