Terraform 从具有地形的范围中提取IP

Terraform 从具有地形的范围中提取IP,terraform,Terraform,我正在尝试从Terraform的范围中提取IP地址 例如,我将这个范围192.168.1.10-192.168.1.20定义为一个字符串,我希望得到如下列表:[192.168.1.10192.168.1.11,…,192.168.1.20] 我查了一下,但没找到办法 这可能吗 为了进一步了解,我正在Kubernetes集群中部署MetalLB,需要将VIP范围定义为如下字符串192.168.1.10-192.168.1.20。 Kubernetes群集部署在OpenStack上,我需要配置中子O

我正在尝试从Terraform的范围中提取IP地址

例如,我将这个范围
192.168.1.10-192.168.1.20
定义为一个字符串,我希望得到如下列表:
[192.168.1.10192.168.1.11,…,192.168.1.20]

我查了一下,但没找到办法

这可能吗

为了进一步了解,我正在Kubernetes集群中部署MetalLB,需要将VIP范围定义为如下字符串
192.168.1.10-192.168.1.20
。 Kubernetes群集部署在OpenStack上,我需要配置中子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内部以如下方式进行本机操作:

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",
]
这将产生以下结果:

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",
]
如果需要偏移该范围,以便IP地址从同一输入端的
.11
.20
,则可以通过更改
本地地址来实现。最后八位字节的列表如下所示:

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

不幸的是,Terraform没有任何内置函数来完成除、、函数之外的更复杂的CIDR数学运算,因此如果您有更复杂的需求,那么您可能需要将其委托给外部脚本,该脚本可以计算并通过调用。

您能解释一下您试图通过此函数的输出实现什么吗?您可能可以使用一些混合的
范围
格式列表
和一些其他函数来实现这一点,但如果您也可以共享这一部分,则可能有更好的方法实现您的总体目标。在您的示例中,您只需更改IPs中的最后一个数字。像这样的情况怎么样:
192.168.1.10-192.168.2.10
?而且,即使您生成了这样的列表,也不是所有的IP地址都可以使用。@ydaetskcoR,我编辑了我的帖子来添加contextThank。从输入的
192.168.1.10-192.168.1.20
中,您需要一个以
192.168.1.11
开头,以
192.168.1.20
结尾的列表,对吗?@ydaetskcoR是,没错