具有索引和值的 Terraform 循环

问题描述 投票:0回答:2

我正在使用 Terraform 创建 Openstack LoadBalancer,我需要循环遍历实例集合并同时使用索引。

特别是,我有 2 个节点:

output "nodes_1" {
  value = [
    for vm in openstack_compute_instance_v2.type_1_instance[*] : tomap({
      name       = "${vm.name}",
      private_ip = "${vm.network[0].fixed_ip_v4}"
    })
  ]
}

output "nodes_2" {
  value = [
    for vm in openstack_compute_instance_v2.type_2_instance[*] : tomap({
      name       = "${vm.name}",
      private_ip = "${vm.network[0].fixed_ip_v4}"
    })
  ]
}

然后我将这些输出连接起来形成一个列表:

cluster_nodes = concat(module.cluster_compute.nodes_1, module.cluster_compute.nodes_2)

最后我需要使用实例“name”和“private_ip”以及对象的索引创建一个 Openstack LoadBalancer:

resource "openstack_lb_listener_v2" "loadbalancer_listener" {
  count = local.total_nodes

  name            = "lb-listener"
  loadbalancer_id = openstack_lb_loadbalancer_v2.cluster_loadbalancer.id
  protocol_port   = sum([local.starting_port, count.index])
}

resource "openstack_lb_pool_v2" "load_balancer_pool" {
  for_each = {
    for index, vm in local.cluster_nodes :
    vm.name => vm
  }

  name        = "pool-${each.value.name}"
  listener_id = openstack_lb_listener_v2.loadbalancer_listener[index(local.cluster_nodes, each.value)].id
}

resource "openstack_lb_member_v2" "load_balancer_member" {
  for_each = {
    for index, vm in local.cluster_nodes :
    vm.name => vm
  }

  name          = "lb-member-${each.value.name}"
  pool_id       = openstack_lb_pool_v2.ssh_load_balancer_pool[index(local.cluster_nodes, each.value)].id
  address       = each.value.private_ip
}

如何迭代并使用实例值和循环索引?

terraform openstack openstack-neutron hcl
2个回答
2
投票

您可以在这两个资源中使用

count

resource "openstack_lb_listener_v2" "loadbalancer_listener" {
  count = length(local.cluster_nodes)

  name            = "lb-listener"
  loadbalancer_id = openstack_lb_loadbalancer_v2.cluster_loadbalancer.id
  protocol_port   = sum([local.starting_port, count.index])
}

resource "openstack_lb_pool_v2" "load_balancer_pool" {
  count = length(local.cluster_nodes)

  name        = "pool-${local.cluster_nodes[count.index].name}"
  listener_id = openstack_lb_listener_v2.loadbalancer_listener[count.index].id
}

另一种选择可能是构建包含端口的节点对象映射,并将其与

for_each
一起使用来创建所有相关资源:

locals {
  cluster_nodes_map = {
    for index, vm in local.cluster_nodes :
    vm.name => {
      name = vm.name
      private_ip = vm.private_ip
      port = sum([local.starting_port, count.index])
    }
  }
}

但是,这仍然使用节点索引来分配端口号,因此如果删除节点,端口将会移动。

您可能想要想出一种不同的方式来分配端口。


0
投票

我有三个端口,我需要创建三个监听器吗?或者只有一个侦听器和端口数组(例如 [“port1”、“port2”、“port3”] 就足够了?

© www.soinside.com 2019 - 2024. All rights reserved.