terraform - 使用 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 个八位字节是相同的,那么您可以使用 、 、 和 函数的组合split
在slice
Terraform内部执行此操作,如下所示join
:range
formatlist
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)
不幸的是,Terraform 没有任何内置函数可以在cidrhost
, cidrnetmask
, cidrsubnet
,cidrsubnets
函数之外进行更精细的 CIDR 数学运算,因此如果您有更复杂的要求,则可能需要将其委托给可以计算并通过external
数据源调用的外部脚本.
推荐阅读
- php - $_SESSION 变量返回 r
- html - 仅在媒体屏幕中禁用浮动
- android - 用户以某种方式访问免费版中的专业版功能
- powerapps - MS Powerapps:Forall 与 Office365.SendEmail 结合使用
- javascript - 物化标签在 Laravel 中不起作用
- ios - 如何让 SnapKit 约束左右边缘?
- json - 是否可以使用 Python 在 JSON 中将日期写为 DateTime 格式而不将其转换为字符串
- python - Tensorflow: Tensor to numpy array conversion without running any session
- push-notification - 带有冒号 (:) 的 FCM 令牌在 Azure NH 中返回错误请求
- c++ - 按下一个产生中断的按钮即可调用多个函数