首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用使用循环构建的块。

引用使用循环构建的块。
EN

Stack Overflow用户
提问于 2020-03-17 19:33:31
回答 1查看 85关注 0票数 0

我最初的工作代码如下

首先我预订了IP

代码语言:javascript
复制
resource "google_compute_address" "ecmp-1" {
  name         = "nat-ecmp-1"
  address      = "10.8.2.6"
}

resource "google_compute_address" "ecmp-2" {
  name         = "nat-ecmp-2"
  address      = "10.8.2.7"
}

然后我创建了实例模板并将I附加到它们上。

代码语言:javascript
复制
resource "google_compute_instance_template" "template-1" {
  name        = "ecmp-1"
  # OMITED EXTRA 
  network_interface {
    # OMITED EXTRA
    network_ip = google_compute_address.ecmp-1.address
  }
}

resource "google_compute_instance_template" "template-2" {
  name        = "ecmp-2"
  # OMITED EXTRA 
  network_interface {
    # OMITED EXTRA
    network_ip = google_compute_address.ecmp-2.address
  }
}

然后我从这些模板中创建实例组。

代码语言:javascript
复制
resource "google_compute_region_instance_group_manager" "nstance-1" {
  name = "instance-1"

  version {
    instance_template = google_compute_instance_template.template-1.self_link
  }
  target_size  = 1
}

resource "google_compute_region_instance_group_manager" "instance-2" {
  name = "instance-2"

  version {
    instance_template = google_compute_instance_template.template-2.self_link
  }
  target_size  = 1
}

上面的代码工作得很好,但是如果我有大量的实例组要创建,代码就会膨胀。为此,我现在使用地图和for_each

我为IP和实例组模板编写的新代码如下

代码语言:javascript
复制
resource "google_compute_address" "reservered-ips" {
  for_each = var.nat_ecmp_frontend_reserved_ips

  name         = each.key
  subnetwork   = "egress-ingress"
  address_type = "INTERNAL"
  address      = each.value
}

resource "google_compute_instance_template" "template-1" {
  for_each = var.nat_ecmp_frontend_reserved_ips

  name        = each.key
  # OMITED EXTRA 
  network_interface {
    # OMITED EXTRA
    network_ip = google_compute_address.reservered-ips[each.key].address
  }
}

现在,下一步是从上面使用for_each循环创建的2个模板中创建一个实例组。

所以当声明

代码语言:javascript
复制
resource "google_compute_region_instance_group_manager" "instances" {
  for_each = var.nat_ecmp_frontend_reserved_ips

  name = each.key

  version {
    instance_template = google_compute_instance_template.<? ? ? ? ?>
  }
  target_size  = 1
}

如何循环和引用instance_template?有什么动态的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-25 22:50:26

引用时,带有resource集的for_each块将显示为映射值,因此您的google_compute_instance_template.template-1结果将是一个映射,其键与var.nat_ecmp_frontend_reserved_ips中的键匹配。

这里您要描述的意图似乎是“每个实例模板创建一个实例组管理器”,我们可以通过使用google_compute_instance_template.template-1映射作为第二个资源的for_each来简洁地表示它,如下所示:

代码语言:javascript
复制
resource "google_compute_region_instance_group_manager" "instances" {
  for_each = google_compute_instance_template.template-1

  name         = each.key
  target_size  = 1

  version {
    instance_template = each.value.id
  }
}

通过将for_each设置为google_compute_instance_template.template-1而不是var.nat_ecmp_frontend_reserved_ips,我们更直接地表达了每个模板应该有一个组管理器的意图。但是,它还有一个更实际的好处,即该块中的each.value引用了每个google_compute_instance_template对象,因此我们可以使用each.value.id来获取与each.key关联的对象的id。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60729090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档