Terraform 0.12语法可将本地地图转换为列表输出

时间:2020-04-27 08:28:23

标签: terraform

我有一个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_cidrs,结果将是: / p>

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

如何在不修改当前locals的情况下实现这一目标?

1 个答案:

答案 0 :(得分:3)

如果直接查看module.my_module.dev_cidrs输出,您会发现它是一个地图,您可以选择module.my_module.dev_cidrs.xxx使用xxx键并返回其值。

如果要获取prod_cidrs的值列表,则可以只使用values function

模块的调用者可以自己这样做:

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