【问题标题】:Terraform: Retrieving each subnet gateway address from a list. GCPTerraform:从列表中检索每个子网网关地址。 GCP
【发布时间】:2020-09-25 13:02:28
【问题描述】:

之前回答了一个问题,以帮助从列表中创建一组子网。现在我正在尝试输出每个分配的 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}"]
}

给我所有的子网输出(一个如下例)

 "rimmer" = {
    "creation_timestamp" = "2020-06-06T03:13:30.244-07:00"
    "description" = ""
    "gateway_address" = "192.2.208.1"
    "id" = "projects/red-dwarf/regions/europe-west2/subnetworks/rimmer"
    "ip_cidr_range" = "192.2.208.0/20"
    "log_config" = []
    "name" = "rimmer"
    "network" = "https://www.googleapis.com/compute/v1/projects/red-dwarf/global/networks/red-dwarf-vpc"
    "private_ip_google_access" = false
    "project" = "red-dwarf"
    "region" = "europe-west2"
    "secondary_ip_range" = []
    "self_link" = "https://www.googleapis.com/compute/v1/projects/red-dwarf/regions/europe-west2/subnetworks/rimmer"

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

当通过 map(string) 配置属性时,如何将属性从创建的子网中提取出来?

编辑 - 子网模块

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"
}

【问题讨论】:

  • 我不知道实际放入什么。之前我会有 module.subnets.subnet1.gateway.address 但现在它是一个列表,它不起作用
  • 现在上面添加了
  • 现已添加。不确定它是否会有所帮助,因为它会输出列表中的所有内容。我只是不知道如何提取这些单独的元素。

标签: terraform terraform-provider-gcp


【解决方案1】:

我会这样做:

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 = { for k, v in aws_subnet.subnet : k => v.arn }
这将创建一个新对象,其键名称和值是我们想要的任何属性。

apply 的 terraform 输出为:

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 }
}

【讨论】:

  • 太好了,谢谢。我有那个工作!我的最后一步是采取(在您的示例中)“Cat”并将其放入值为“subnet-046fff167cdc81e9f”的秘密管理器中。正如您可能会说的那样,我不仅是 Terraform 的新手,而且是一般的编码新手!
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多