【问题标题】:Extract IP from a range with Terraform使用 Terraform 从范围中提取 IP
【发布时间】:2021-01-04 23:14:53
【问题描述】:

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

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

我检查了Terraform functions,但没有找到方法。

这可能吗?

关于进一步的上下文,我在 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"
    }
  }
....
}

【问题讨论】:

  • 你能解释一下你想用这个输出实现什么吗?您可能可以使用 rangeformatlist 和其他一些功能的混合来做到这一点,但如果您也可以分享这部分,可能会有更好的方法来实现您的总体目标。
  • 在您的示例中,您只需更改 IP 中的最后一个数字。像这样的情况呢:192.168.1.10-192.168.2.10?即使您生成此类列表,也并非所有 IP 地址都可用。
  • @ydaetskcoR,我编辑了我的帖子以添加上下文
  • 谢谢。从输入192.168.1.10-192.168.1.20 你想要一个以192.168.1.11 开头并以192.168.1.20 结尾的列表,对吗?
  • @ydaetskcoR 是的,完全正确

标签: terraform


【解决方案1】:

如果您可以依赖 IP 范围的前 3 个八位字节相同,那么您可以使用 splitslicejoinrangeformatlist 函数的组合来避免在 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",
]

如果您需要偏移该范围,以便最终从同一输入中获得从 .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 data source调用的外部脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多