Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 参照使用循环生成的块_Terraform - Fatal编程技术网

Terraform 参照使用循环生成的块

Terraform 参照使用循环生成的块,terraform,Terraform,我的初始工作代码如下所示 首先我保留IP服务器 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" } 然后我创建了实例模板并将IP

我的初始工作代码如下所示

首先我保留IP服务器

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"
}
然后我创建了实例模板并将IP附加到它们上

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
  }
}
然后我用这些模板创建实例组

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
}
上面的代码工作得很好,但是如果我有很多实例组要创建,代码就会变得臃肿。对于这一点,我现在使用地图和

我的IPs和实例组模板的新代码如下

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
循环从上述两个模板中创建一个实例组

那么在宣布这一点时,

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
}
resource“google\u compute\u region\u instance\u group\u manager”实例{
for_each=var.nat_ecmp_frontend_reserved_ips
name=each.key
版本{
实例模板=谷歌计算实例模板。
}
目标大小=1
}

如何循环和引用
实例\u模板
?有什么动态的方法可以做到这一点吗

A
resource
块,每个
集合都带有
for\u,当被引用时会显示为映射值,因此您的
google\u compute\u实例\u模板。template-1
结果将是一个映射,其键与
var.nat\u ecmp\u frontend\u reserved\u ips
中的键匹配

看起来您想要在这里描述的意图是“为每个实例模板创建一个实例组管理器”,我们可以通过使用
google\u compute\u instance\u template.template-1
map作为第二个资源的每个
,简洁地表示它,如下所示:

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
  }
}
通过将每个
设置为
google\u compute\u instance\u template.template-1
而不是
var.nat\u ecmp\u frontend\u reserved\u ips
,我们更直接地表达了每个模板应该有一个组管理器的意图。但是它还有一个更实际的好处,那就是块中的
each.value
引用了
google\u compute\u instance\u template
对象,因此我们可以使用
each.value.id
来获取与
each.key
关联的对象的id