Terraform:从列表中检索每个子网网关地址。GCP

Terraform:从列表中检索每个子网网关地址。GCP,terraform,terraform-provider-gcp,Terraform,Terraform Provider Gcp,之前回答了一个问题,以帮助从列表中创建一组子网。现在我试图输出每个分配的ip地址 module "subnets" { source = "../../../Modules/subnets-test/" network_name = module.vpc.network_name subnet_region = "europe-west2" subnets = { lister = "192.2.128.0/18", kryten = "192.2.0.0/17

之前回答了一个问题,以帮助从列表中创建一组子网。现在我试图输出每个分配的ip地址

module "subnets" {
  source = "../../../Modules/subnets-test/"
  network_name = module.vpc.network_name
  subnet_region = "europe-west2"

  subnets = {
    lister = "192.2.128.0/18",
    kryten = "192.2.0.0/17",
    rimmer = "192.2.208.0/20",
    cat = "192.2.192.0/20",
    holly = "192.2.224.0/20"
  }
}
我可以成功输出子网列表及其值

output "private_subnets" {
  description = "List of IDs of private subnets"
  value       = ["${module.subnets.subnets}"]
}
给我所有的子网输出(如下例)

但现在我只想将网关地址提取为单个输出。但是,我尝试对模块执行的任何操作都会给我一个错误,即列表有5个属性

通过映射(字符串)设置属性后,如何从创建的子网中提取属性

编辑子网模块

resource "google_compute_subnetwork" "subnet" {
  network       = var.network_name
  for_each      = var.subnets
  name         = each.key
  ip_cidr_range = each.value

}

编辑-子网输出-将所有内容作为一个整体输出

output "subnets" {
  value       = google_compute_subnetwork.subnet
  description = "The created subnet resources"
}

下面是我要做的:

locals {
  subnets = {
    cow = "10.0.208.0/20",
    cat = "10.0.192.0/20",
    dog = "10.0.224.0/20"
  }
}

provider "aws" {
  region = "us-east-1"
}

resource "aws_vpc" "myvpc" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "subnet" {
  vpc_id     = aws_vpc.myvpc.id
  for_each   = local.subnets
  cidr_block = each.value
  tags       = { Name = each.key }
}

output "subnets" {
  value = aws_subnet.subnet
}

output "subnets_arn" {
  value = { for k, v in aws_subnet.subnet : k => v.arn }
}

这里的键是for循环:
value={对于aws_子网中的k,v.subnet:k=>v.arn}

这将创建一个新对象,其键的名称和值为所需的任何属性

应用程序的地形输出为:

subnets_arn = {
  "cat" = "arn:aws:ec2:us-east-1:841836440307:subnet/subnet-046fff167cdc81e9f"
  "cow" = "arn:aws:ec2:us-east-1:841836440307:subnet/subnet-00217a1ec0531d2c6"
  "dog" = "arn:aws:ec2:us-east-1:841836440307:subnet/subnet-0ac82ef0fd87bcee2"
}


在我的例子中,我使用的是AWS(这是我现在可以访问的),但同样的应该转换为GCP,只需使用您需要的属性,经过教育的猜测应该是这样的:

output "subnets_gateway_address" {
  value = { for k, v in aws_subnet.subnet : k => v.gateway_address }
}

我不知道该放什么进去。以前我会有module.subnets.subnet1.gateway.address,但现在它是一个列表,无法添加到中,现在添加到上面。不确定它是否有用,因为它正在输出列表中的所有内容。我只是不知道如何提取这些元素。太好了,谢谢。我有工作!我的最后一步是(在您的示例中)使用“Cat”并将其放入secrets manager中,其值为“subnet-046fff167cdc81e9f”。正如你可能会告诉我的,我不仅是新的地形,但一般编码!
output "subnets_gateway_address" {
  value = { for k, v in aws_subnet.subnet : k => v.gateway_address }
}