Terraform AWS 上的下一个可用 CIDR
Terraform next available CIDR on AWS
我想看看我们的 Terraform 代码是否有可能以编程方式找出用于 VPC 的下一个 CIDR。
VPC CIDR 范围 172.20.1-255.0/24
到目前为止我有:
data "aws_vpcs" "existing_vpcs" {
}
data "aws_vpc" "details" {
count = "${length(data.aws_vpcs.existing_vpcs.ids)}"
id = "${element(data.aws_vpcs.existing_vpcs.ids, count.index)}"
}
output "all_vpc_ids" {
value = "${data.aws_vpcs.existing_vpcs.ids}"
}
output "current_vpc_cidrs" {
value = "${data.aws_vpc.details.*.cidr_block}"
}
output "Current VPCs" {
value = "${length(data.aws_vpcs.existing_vpcs.ids)}"
}
这将输出如下内容:
Outputs:
Current VPCs = 8
all_vpc_ids = [
vpc-xxx,
vpc-xxx,
]
current_vpc_cidrs = [
172.20.1.0/24,
172.20.5.0/24,
]
我想将变量设置为 172.20.2.0/24,因为它在技术上是下一个可用的。
Terraform 的数据源功能旨在获取不经常更改且(通常)仅作为代表操作员的有意操作的结果而更改的数据。不幸的是,下一个 "available" CIDR 块不是一个好的候选者,因为创建 next VPC 的行为会改变结果,导致生成的配置永远不会收敛。
Terraform 相反期望明确地进行这种分配。在这种情况下,这意味着为您的网络建立一个明确的编号约定,然后您可以在 Terraform 配置中进行描述,从而允许 Terraform 根据配置中已有的信息查找或计算 suitable VPC。
例如,AWS 用户经常定义一个映射,这样每个区域和区域可用性区域都在中央 table 中分配一个数字(例如,直接在配置中的映射值,或通过访问的外部系统数据源),然后可以通过查询 table.
来发现 VPC 或子网的地址
如果您的系统具有更不寻常的网络特征,即定期创建和销毁与 AWS 区域和可用性区域没有直接关系的网络,我建议使用 Terraform 之外的一些外部软件来管理子网的分配,然后将该软件做出的决定作为 input variable 传递到 Terraform 中。这样,可以将决策记录在该外部系统(例如数据库)中,并在需要应用更改时再次调用。
具有不寻常用例的用户有时也会发现最好将其配置的主要部分分解为可重用模块,然后动态生成(使用预处理工具)调用该模块的最小根模块使用在 Terraform 之外做出的一些数据或决策。这种用法不在 Terraform 的主要用例中,但可以使其发挥作用。对于非常的动态环境,Terraform 可能不是完成这项工作的正确工具。
如果我正确理解你的问题。您可以将 cidrnet
函数与 count
一起使用。自动从 VPC 网络地址路径中选取。
resource "aws_subnet" "private" {
count = "${var.pvt_subnet_count}"
cidr_block = "${cidrsubnet(var.network_address_space,8,count.index + 1)}"
vpc_id = "${aws_vpc.ozonevpc.id}"}
也许这可以帮助您完成任务:
我想看看我们的 Terraform 代码是否有可能以编程方式找出用于 VPC 的下一个 CIDR。
VPC CIDR 范围 172.20.1-255.0/24
到目前为止我有:
data "aws_vpcs" "existing_vpcs" {
}
data "aws_vpc" "details" {
count = "${length(data.aws_vpcs.existing_vpcs.ids)}"
id = "${element(data.aws_vpcs.existing_vpcs.ids, count.index)}"
}
output "all_vpc_ids" {
value = "${data.aws_vpcs.existing_vpcs.ids}"
}
output "current_vpc_cidrs" {
value = "${data.aws_vpc.details.*.cidr_block}"
}
output "Current VPCs" {
value = "${length(data.aws_vpcs.existing_vpcs.ids)}"
}
这将输出如下内容:
Outputs:
Current VPCs = 8
all_vpc_ids = [
vpc-xxx,
vpc-xxx,
]
current_vpc_cidrs = [
172.20.1.0/24,
172.20.5.0/24,
]
我想将变量设置为 172.20.2.0/24,因为它在技术上是下一个可用的。
Terraform 的数据源功能旨在获取不经常更改且(通常)仅作为代表操作员的有意操作的结果而更改的数据。不幸的是,下一个 "available" CIDR 块不是一个好的候选者,因为创建 next VPC 的行为会改变结果,导致生成的配置永远不会收敛。
Terraform 相反期望明确地进行这种分配。在这种情况下,这意味着为您的网络建立一个明确的编号约定,然后您可以在 Terraform 配置中进行描述,从而允许 Terraform 根据配置中已有的信息查找或计算 suitable VPC。
例如,AWS 用户经常定义一个映射,这样每个区域和区域可用性区域都在中央 table 中分配一个数字(例如,直接在配置中的映射值,或通过访问的外部系统数据源),然后可以通过查询 table.
来发现 VPC 或子网的地址如果您的系统具有更不寻常的网络特征,即定期创建和销毁与 AWS 区域和可用性区域没有直接关系的网络,我建议使用 Terraform 之外的一些外部软件来管理子网的分配,然后将该软件做出的决定作为 input variable 传递到 Terraform 中。这样,可以将决策记录在该外部系统(例如数据库)中,并在需要应用更改时再次调用。
具有不寻常用例的用户有时也会发现最好将其配置的主要部分分解为可重用模块,然后动态生成(使用预处理工具)调用该模块的最小根模块使用在 Terraform 之外做出的一些数据或决策。这种用法不在 Terraform 的主要用例中,但可以使其发挥作用。对于非常的动态环境,Terraform 可能不是完成这项工作的正确工具。
如果我正确理解你的问题。您可以将 cidrnet
函数与 count
一起使用。自动从 VPC 网络地址路径中选取。
resource "aws_subnet" "private" {
count = "${var.pvt_subnet_count}"
cidr_block = "${cidrsubnet(var.network_address_space,8,count.index + 1)}"
vpc_id = "${aws_vpc.ozonevpc.id}"}
也许这可以帮助您完成任务: