我最初的工作代码如下
首先我预订了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"
}然后我创建了实例模板并将I附加到它们上。
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
}上面的代码工作得很好,但是如果我有大量的实例组要创建,代码就会膨胀。为此,我现在使用地图和for_each
我为IP和实例组模板编写的新代码如下
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个模板中创建一个实例组。
所以当声明
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?有什么动态的方法吗?
发布于 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来简洁地表示它,如下所示:
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。
https://stackoverflow.com/questions/60729090
复制相似问题