Terraform - извлечение значения на основе текста из вывода - PullRequest
1 голос
/ 13 июня 2019

У меня есть следующий модуль, который создает подсети в GCP:

/******************************************
    Subnet configuration
 *****************************************/
resource "google_compute_subnetwork" "subnetwork" {
  count = "${length(var.subnets)}"

  name                     = "${lookup(var.subnets[count.index], "subnet_name")}"
  ip_cidr_range            = "${lookup(var.subnets[count.index], "subnet_ip")}"
  region                   = "${lookup(var.subnets[count.index], "subnet_region")}"
  private_ip_google_access = "${lookup(var.subnets[count.index], "subnet_private_access", "false")}"
  enable_flow_logs         = "${lookup(var.subnets[count.index], "subnet_flow_logs", "false")}"
  network                  = "${google_compute_network.network.name}"
  project                  = "${var.project_id}"

  secondary_ip_range = "${var.secondary_ranges[lookup(var.subnets[count.index], "subnet_name")]}"
}

data "google_compute_subnetwork" "created_subnets" {
  count = "${length(var.subnets)}"

  name    = "${element(google_compute_subnetwork.subnetwork.*.name, count.index)}"
  region  = "${element(google_compute_subnetwork.subnetwork.*.region, count.index)}"
  project = "${var.project_id}"
}

Мой вывод выглядит так:

output "subnets_self_links" {
  value       = "${google_compute_subnetwork.subnetwork.*.self_link}"
  description = "The self-links of subnets being created"
}

Этот вывод создает список подсетей.

Мне нужно иметь возможность извлечь следующее, выполнив поиск по имени подсети. В данном случае это «подсеть-01»:

subnetwork = "https://www.googleapis.com/compute/v1/projects/abc-network-hub/regions/us-central1/subnetworks/subnet-01"

Как мне создать свой поиск для поиска по тексту?

subnetwork = "${module.test-vpc.subnets_self_links}"

Выше возвращается:

"module.compute-o057qdb2-l30.var.subnetwork: переменная подсеть в модуль compute-o057qdb2-l30 должен иметь тип string, получил список "

subnetwork = "${lookup(module.test-vpc.subnets_self_links, "subnet-01, 0")}"

Выше возвращается:

  • module.compute-o057qdb2-l30.var.subnetwork: В столбце 3, строка 1: lookup: аргумент 1 должен быть картой типов, получен список типов в:

$ {lookup (module.test-vpc.subnets_self_links, "subnet-01, 0")}

subnetwork = "${module.test-vpc.subnets_self_links[0]}"

Выше работает, потому что создана только одна подсеть, и я могу ссылаться на индекс списка. Мне нужно иметь возможность искать по имени подсети. Я чувствую, что должен быть в состоянии извлечь значения из «данных».

Это модуль, который я использую: https://github.com/terraform-google-modules/terraform-google-network

1 Ответ

0 голосов
/ 14 июня 2019

Terraform 0.12 делает это легко:

variable "subnets" {
    default = [
        {
            name = "subnet-01"
            id = 1
        },
        {
            name = "subnet-02"
            id = 2
        }
    ]
}

output "subnet-one" {
    value = [
        for subnet in var.subnets:
            subnet.id if subnet.name == "subnet-01"
    ][0]
}

До HCL 2 такие вещи были довольно громоздкими.

...