使用Terraform从一系列中提取IP



我正在尝试使用Terraform从一个范围中提取IP地址。

例如,我将这个范围192.168.1.10-192.168.1.20定义为一个字符串,我想得到一个这样的列表:[192.168.1.10,192.168.1.11,…,192.168.1.20]

我检查了Terraform函数,但没有找到这样做的方法。

这可能吗?

对于进一步的上下文,我将在Kubernetes集群中部署MetalLB,并需要将VIP范围定义为类似192.168.1.10-192.168.1.20的字符串。Kubernetes集群部署在OpenStack上,我需要配置Neutron OpenStack端口来接受该范围内的所有IP地址:

resource "openstack_networking_port_v2" "k8s_worker_mgmt_port" {
name           = "k8s_worker_mgmt_port"
network_id     = data.openstack_networking_network_v2.k8s_openstack_mgmt_network_name.id
admin_state_up = "true"
allowed_address_pairs {
ip_address = "192.168.1.10"
}
allowed_address_pairs {
ip_address = "192.168.1.11"
}
}
....
}

如果您可以依赖于IP范围的前3个八位字节是相同的,那么您可以在Terraform内部使用splitslicejoinrangeformatlist函数的组合来实现这一点,如下所示:

variable "ip_range" {
default = "192.168.1.10-192.168.1.20"
}
locals {
ip_range_start = split("-", var.ip_range)[0]
ip_range_end   = split("-", var.ip_range)[1]
# Note that this naively only works for IP ranges using the same first three octects
ip_range_first_three_octets = join(".", slice(split(".", local.ip_range_start), 0, 3))
ip_range_start_fourth_octet = split(".", local.ip_range_start)[3]
ip_range_end_fourth_octet   = split(".", local.ip_range_end)[3]
list_of_final_octet  = range(local.ip_range_start_fourth_octet, local.ip_range_end_fourth_octet)
list_of_ips_in_range = formatlist("${local.ip_range_first_three_octets}.%s", local.list_of_final_octet)
}
output "list_of_ips_in_range" {
value = local.list_of_ips_in_range
}

这会输出以下内容:

list_of_ips_in_range = [
"192.168.1.10",
"192.168.1.11",
"192.168.1.12",
"192.168.1.13",
"192.168.1.14",
"192.168.1.15",
"192.168.1.16",
"192.168.1.17",
"192.168.1.18",
"192.168.1.19",
]

如果您需要偏移该范围,以便从同一输入中获得从.11.20的IP地址,那么您可以通过如下方式更改local.list_of_final_octet

list_of_final_octet  = range(local.ip_range_start_fourth_octet + 1, local.ip_range_end_fourth_octet + 1)

不幸的是,除了cidrhostcidrnetmaskcidrsubnetcidrsubnets函数之外,Terraform没有任何内置函数来进行更精细的CIDR计算,因此如果您有更复杂的需求,则可能需要将其委托给一个外部脚本,该脚本可以计算它并通过external数据源进行调用。

最新更新