【问题标题】:Terraform variable definitionTerraform 变量定义
【发布时间】:2021-07-22 07:26:13
【问题描述】:

我想创建一个部署输入并基于该变量驱动我的部署。 这是一个示例部署输入,

deployments = {
    dev-1 = {
        dev-api-us = {
            hosts = ["dev-api-us.lm.com", "dev-api-us.lm1.com"]
        }
        region = "us-east1"
    }
    dev-2 = {
        dev-api-uk = {
            hosts = ["dev-api-uk.lm.com", "dev-api-uk.lm1.com"]
        }
        region = "europe-west2"
    }
}

如果是有效输入,那么对应的变量定义是什么样的?

我试过了,但它说语法不正确

variable "deployments" {
  description = "A map of deployment"
  type = map(map(object({
        hosts = list(string)
      })
    region = string
    ))
}

感谢任何帮助。

【问题讨论】:

    标签: terraform terraform0.12+


    【解决方案1】:

    这个数据结构有点混乱,因为第二层似乎是预定义属性(region)和任意映射键(如dev-api-usdev-api-uk)的混合。

    我认为在这里进行的最佳方法是更改​​此结构,以便第二级地图与其嵌入的对象分开。您在问题中没有提到名词来指代dev-api-usdev-api-uk 是其中的示例,因此我将仅将它们称为“主机前缀”,以方便称呼它们:

    {
      dev-1 = {
        host_prefixes = {
          dev-api-us = {
            hosts = ["dev-api-us.lm.com", "dev-api-us.lm1.com"]
          }
        }
        region = "us-east1"
      }
      dev-2 = {
        host_prefixes = {
          dev-api-uk = {
            hosts = ["dev-api-uk.lm.com", "dev-api-uk.lm1.com"]
          }
        }
        region = "europe-west2"
      }
    }
    

    这种调整后的数据结构的合适类型约束可能是:

    variable "deployments" {
      type = map(object({
        host_prefixes = map(object({
          hosts = set(string)
        }))
        region = string
      }))
    }
    

    这种改变的结构在 Terraform 的类型系统中起作用,因为它将对象类型部分与映射类型部分分开。 Terraform 语言没有任何类型约束,允许将地图和对象行为组合成一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2021-01-14
      • 2022-11-11
      相关资源
      最近更新 更多