【问题标题】: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-us 和dev-api-uk)的混合。
我认为在这里进行的最佳方法是更改此结构,以便第二级地图与其嵌入的对象分开。您在问题中没有提到名词来指代dev-api-us 和dev-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 语言没有任何类型约束,允许将地图和对象行为组合成一个值。