Terraform: 清理可能是字符串映射、映射映射或两者组合的映射

30次阅读
没有评论

问题描述

想要对传入的映射进行清理,使其符合以下格式,并将其放在locals部分中:

cidrs_sanitized = {
  A = [1.1.1.1]
  B = [2.2.2.2, 3.3.3.3]
  Group1 = [4.4.4.4, 5.5.5.5]
  C = [4.4.4.4]
  D = [5.5.5.5]
}

用户尝试了各种循环的方法,但是都没有成功。他尝试了将每组值作为单独的变量并将它们合并在一起的方法,但是合并总是失败,因为输出是元组,他无法找到如何让terraform显示locals grouped、groups和single的值。
用户希望得到一些帮助或指导,谢谢。

解决方案

根据Terraform的文档,一个映射是一组键/值对的集合,有一个约束条件:“…只要每个元素都是相同类型的元素”。
所以你声明的输入映射已经是一个无效的映射,至少对于Terraform 0.12来说是这样的。
以下是产生的错误示例:

variable "cidrs" {
  description = ""
  type        = map
  default = [
    ["1.1.1.1"],
    ["2.2.2.2", "3.3.3.3"],
    {
      C = ["4.4.4.4"]
      D = ["5.5.5.5"]
    }
  ]
}

在验证时会引发错误:

$> terraform validate
Error: Invalid default value for variable on vars.tf line 65, in variable "cidrs":
  65:   default = [
  66:     ["1.1.1.1"],
  67:     ["2.2.2.2", "3.3.3.3"],
  68:     {
  69:       C = ["4.4.4.4"]
  70:       D = ["5.5.5.5"]
  71:     }]
This default value is not compatible with the variable's type constraint: map of any single type required.

鉴于这一点,如果我们可以将A和B泛化为“值为列表”的值,将Group1泛化为“值为映射”的值,并且输入是一个固定类型的有序输入,我们可以使用元组或对象来更可读(和可维护)地解决这个问题。如果是这样,请告诉我们,我们可以扩展这个答案。

正文完