从Terraform 0.11升级到0.12期间的列表问题
我在尝试重写列表以在Terraform 0.12中工作时遇到问题 这在地形0.11中起作用 这是我的清单:从Terraform 0.11升级到0.12期间的列表问题,terraform,terraform0.12+,Terraform,Terraform0.12+,我在尝试重写列表以在Terraform 0.12中工作时遇到问题 这在地形0.11中起作用 这是我的清单: variable "master_authorized_networks_config" { type = list(string) description = "The list of CIDR blocks of master authorized networks." default = [ { cidr_blocks = [
variable "master_authorized_networks_config" {
type = list(string)
description = "The list of CIDR blocks of master authorized networks."
default = [
{
cidr_blocks = [
{
cidr_block = "XXXXXX/32"
display_name = "XXXXX"
},
{
cidr_block = "XXXXXX/32"
display_name = "XXXXX"
},
{
cidr_block = "XXXXXX/32"
display_name = "XXXXX"
},
{
cidr_block = "XXXXXX/32"
display_name = "XXXXX"
},
]
},
]
我将其添加到模块:
master\u authorized\u networks\u config=var.master\u authorized\u networks\u config
运行terraform apply后,我出现以下错误:
Error: Invalid default value for variable
on ../../modules/xxx/xxx/variables.tf line 71, in variable "master_authorized_networks_config":
71: default = [
72: {
73: cidr_blocks = [
74: {
75: cidr_block = "XXXXXX/32"
76: display_name = "XXXXX"
77: },
78: {
79: cidr_block = "XXXXXX/32"
80: display_name = "XXXXX"
81: },
82: {
83: cidr_block = "XXXXXX/32"
84: display_name = "XXXXX"
85: },
86: {
87: cidr_block = "XXXXXX/32"
88: display_name = "XXXXX"
89: },
102: ]
103: },
104: ]
This default value is not compatible with the variable's type constraint:
element 0: string required.
我解决不了这个问题。您能帮助我吗?错误告诉您,您的默认值与您用type=liststring告诉Terraform的类型约束不匹配。该类型约束表示它必须是字符串列表,并且是0.11通过0.12upgrade工具提供的默认值,如果您以前使用type=list,则您可能已经运行该工具来获取该输出 您可以将类型约束更改为listobject。如果您简化了数据结构,只需要一个包含cidr_块和display_名称键的对象列表,而不需要包含包含上述对象列表的关键cidr_块的对象列表,那么您甚至可以更精确地验证:
variable "master_authorized_networks_config" {
type = list(object{
cidr_block = string
display_name = string
})
description = "The list of CIDR blocks of master authorized networks."
default = [
{
cidr_block = "XXXXXX/32"
display_name = "XXXXX"
},
# ...
]
}
或者,更简单的是,当提供默认值时,您可以选择让Terraform通过从变量中删除类型参数来自动推断预期的对象类型。然后,如果有人试图传入与默认Terraform类型不匹配的变量,将在计划或验证时告诉您。错误是告诉您默认值与您告诉Terraform的type=liststring的类型约束不匹配。该类型约束表示它必须是字符串列表,并且是0.11通过0.12upgrade工具提供的默认值,如果您以前使用type=list,则您可能已经运行该工具来获取该输出 您可以将类型约束更改为listobject。如果您简化了数据结构,只需要一个包含cidr_块和display_名称键的对象列表,而不需要包含包含上述对象列表的关键cidr_块的对象列表,那么您甚至可以更精确地验证:
variable "master_authorized_networks_config" {
type = list(object{
cidr_block = string
display_name = string
})
description = "The list of CIDR blocks of master authorized networks."
default = [
{
cidr_block = "XXXXXX/32"
display_name = "XXXXX"
},
# ...
]
}
或者,更简单的是,当提供默认值时,您可以选择让Terraform通过从变量中删除类型参数来自动推断预期的对象类型。然后,如果有人试图传入与默认地形类型不匹配的变量,将在计划或验证时告诉您。这不是字符串列表。您应该将类型设置为listobject,或者完全删除类型部分,并允许Terraform从默认值计算出类型。第二个选项是我要做的。liststring不是0.11中允许的类型规范。您确定您在0.11中成功地使用了此功能吗?非常确定他们以前使用type=list时运行过0.12upgrade,并最终使用了该功能。我的0.12升级已经有很长时间了,但我认为这是该工具的默认行为。它不是字符串列表。您应该将类型设置为listobject,或者完全删除类型部分,并允许Terraform从默认值计算出类型。第二个选项是我要做的。liststring不是0.11中允许的类型规范。您确定您在0.11中成功地使用了此功能吗?非常确定他们以前使用type=list时运行过0.12upgrade,并最终使用了该功能。我的0.12升级已经有很长时间了,但我认为这是该工具的默认行为。