Terraform 参照使用循环生成的块
我的初始工作代码如下所示 首先我保留IP服务器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
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模板
?有什么动态的方法可以做到这一点吗 Aresource
块,每个集合都带有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