Terraform 可以使用字符串和地图元素绘制地形图吗?
我想创建一个如下所示的地图:Terraform 可以使用字符串和地图元素绘制地形图吗?,terraform,Terraform,我想创建一个如下所示的地图: variable "test" { type = map(any) default = { param1 = "sdfsdf", param2 = "sdfsfd", param3 = { mylist = [ "aaaaa", "bbbbb", "ccccc&quo
variable "test" {
type = map(any)
default = {
param1 = "sdfsdf",
param2 = "sdfsfd",
param3 = {
mylist = [
"aaaaa",
"bbbbb",
"ccccc"
]
}
我得到这个错误:
This default value is not compatible with the variable's type constraint: all
map elements must have the same type.
这是否意味着我已经定义了var权限,或者terraform不允许这样做?它不起作用,因为地图、字符串和字符串列表中存在混合类型,如文档中所述 在您的情况下,您可以使用
type=any
:
variable "test" {
type = any
default = {
param1 = "sdfsdf",
param2 = "sdfsfd",
param3 = {
mylist = [
"aaaaa",
"bbbbb",
"ccccc"
]
}
}
}
它不起作用,因为您在映射、字符串和字符串列表中混合了类型,如文档中所述 在您的情况下,您可以使用
type=any
:
variable "test" {
type = any
default = {
param1 = "sdfsdf",
param2 = "sdfsfd",
param3 = {
mylist = [
"aaaaa",
"bbbbb",
"ccccc"
]
}
}
}
您在这里遇到的是和之间的地形语言的差异 “Map”是一种集合类型,Map值是任意数量的元素,每个元素由任意字符串标识,但所有值都是相同类型的 在您的例子中,听起来您想要声明您需要一组特定的属性,每个属性都有自己的类型约束。每个元素具有单独类型的固定结构由结构类型表示,“对象”是最类似于贴图的结构类型类型 以下是一个对象类型约束,它将接受您在问题中包含的示例值:
variable "test" {
type = object({
param1 = string
param2 = string
param3 = object({
mylist = list(string)
})
})
}
如果您希望允许调用方在param3
中设置任意数量的键,并且这些键都是字符串列表,则可以将其设置为字符串列表的映射:
variable "test" {
type = object({
param1 = string
param2 = string
param3 = map(list(string))
})
}
在大多数情况下,模块会预期特定的数据类型,如果给定的值不是该类型,则会失败,在这种情况下,完整写出该类型有助于向调用模块的人员提供指导,并允许Terraform验证该值。但是,在某些情况下,您确实希望只接受任意值——例如,如果您打算只对值进行JSON编码并将其逐字发送到资源的参数——因此在这种情况下,您可以将类型约束设置为any
,这将接受任何类型的值:
variable "test" {
type = any
}
在这种情况下,Terraform根本不会检查传入值,因此您的模块不应该对其类型进行任何假设。您在这里遇到的是和之间Terraform语言的差异 “Map”是一种集合类型,Map值是任意数量的元素,每个元素由任意字符串标识,但所有值都是相同类型的 在您的例子中,听起来您想要声明您需要一组特定的属性,每个属性都有自己的类型约束。每个元素具有单独类型的固定结构由结构类型表示,“对象”是最类似于贴图的结构类型类型 以下是一个对象类型约束,它将接受您在问题中包含的示例值:
variable "test" {
type = object({
param1 = string
param2 = string
param3 = object({
mylist = list(string)
})
})
}
如果您希望允许调用方在param3
中设置任意数量的键,并且这些键都是字符串列表,则可以将其设置为字符串列表的映射:
variable "test" {
type = object({
param1 = string
param2 = string
param3 = map(list(string))
})
}
在大多数情况下,模块会预期特定的数据类型,如果给定的值不是该类型,则会失败,在这种情况下,完整写出该类型有助于向调用模块的人员提供指导,并允许Terraform验证该值。但是,在某些情况下,您确实希望只接受任意值——例如,如果您打算只对值进行JSON编码并将其逐字发送到资源的参数——因此在这种情况下,您可以将类型约束设置为any
,这将接受任何类型的值:
variable "test" {
type = any
}
在这种情况下,Terraform根本不会检查输入值,因此您的模块不应该对其类型进行任何假设。将此标记为答案。我没有在我的问题中包含这些信息,但我最初试图得到一个完整的对象定义,并假设不可能将其标记为答案。我没有在我的问题中包含这些信息,但我最初试图得到一个完整的对象定义,并假设这是不可能的