Синтаксис Terraform 0.12 для преобразования карты местных жителей в вывод списка - PullRequest
1 голос
/ 27 апреля 2020

У меня есть модуль Terraform, у которого есть карта местных жителей, подобная этой ...

locals {
  prod_cidrs = {
    xxx = "XX.XX.XX.XX/DV"
    yyy = "YY.YY.YY.YY/DV"
    zzz = "ZZ.ZZ.ZZ.ZZ/DV"
  }
  dev_cidrs = {
    xxx = "XX.XX.XX.XX/PD"
    yyy = "YY.YY.YY.YY/PD"
    zzz = "ZZ.ZZ.ZZ.ZZ/PD"
  }
}

... обеспечивает некоторые выходные данные, такие как ...

output "prod_cidrs" {
  value = local.prod_cidrs
}

output "dev_cidrs" {
  value = local.dev_cidrs
}

, чтобы потребители могли Получить module.my_module.dev_cidrs.xxx (это будет или "XX.XX.XX.XX/DV") или module.my_module.prod_cidrs.yyy (это будет или "YY.YY.YY.YY/PD") среди остальных комбинаций.

Теперь я хочу предоставить дополнительный output, который дает мой потребитель может извлекать все CIDR для prod или dev в виде списка одновременно, так что результат будет для prod_cidrs например:

["XX.XX.XX.XX/PD", "YY.YY.YY.YY/PD", "ZZ.ZZ.ZZ.ZZ/PD"]

Как мне этого добиться без изменения моего текущего locals?

1 Ответ

3 голосов
/ 27 апреля 2020

Если вы посмотрите на вывод module.my_module.dev_cidrs напрямую, вы увидите, что это карта, которая позволяет вам выбрать module.my_module.dev_cidrs.xxx для использования клавиши xxx и вернуть ее значение.

Если вы Если вам нужен список значений prod_cidrs, тогда вы можете просто использовать функцию values .

Вызывающие модули вашего модуля могут сделать это сами так:

module "foo" {
  source = "./module"
}

output "dev_x" {
  value = module.foo.dev_cidrs.xxx
}

output "all_prod_map" {
  value = module.foo.prod_cidrs
}

output "all_prod_list" {
  value = values(module.foo.prod_cidrs)
}

Или вы можете добавить дополнительный вывод в ваш модуль:

locals {
  prod_cidrs = {
    xxx = "XX.XX.XX.XX/DV"
    yyy = "YY.YY.YY.YY/DV"
    zzz = "ZZ.ZZ.ZZ.ZZ/DV"
  }
  dev_cidrs = {
    xxx = "XX.XX.XX.XX/PD"
    yyy = "YY.YY.YY.YY/PD"
    zzz = "ZZ.ZZ.ZZ.ZZ/PD"
  }
}

output "prod_cidrs" {
  value = local.prod_cidrs
}

output "dev_cidrs" {
  value = local.dev_cidrs
}

output "all_prod_cidrs" {
  value = values(local.prod_cidrs)
}

, и они могут использовать его как module.foo.all_prod_cidrs.

...