列出从 Terraform 0.11 升级到 0.12 期间的问题
List issue during upgrade from Terraform 0.11 to 0.12
我在尝试重写列表以在 Terraform 0.12 中工作时遇到问题
适用于 Terraform 0.11。
这是我的清单:
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_authorized_networks_config = var.master_authorized_networks_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 = list(string)
告诉 Terraform 的类型约束不匹配。该类型约束表示它必须是一个字符串列表,并且是通过 0.12upgrade
工具来自 0.11 的默认值,如果您之前有 type = list
,您可能 运行 获得该输出。
您可以将类型限制更改为 list(object)
。如果你简化了你的数据结构,这样你就只有一个带有 cidr_block
和 display_name
键的对象列表,而不是一个带有键 cidr_blocks
的对象列表,它包含上述对象的列表,然后您甚至可以更准确地验证这一点:
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 通过从变量中删除 type
参数来自动推断预期的对象类型。然后,如果有人试图传入与默认 Terraform 类型不匹配的变量,则会在计划或验证时告诉您。
我在尝试重写列表以在 Terraform 0.12 中工作时遇到问题 适用于 Terraform 0.11。
这是我的清单:
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_authorized_networks_config = var.master_authorized_networks_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 = list(string)
告诉 Terraform 的类型约束不匹配。该类型约束表示它必须是一个字符串列表,并且是通过 0.12upgrade
工具来自 0.11 的默认值,如果您之前有 type = list
,您可能 运行 获得该输出。
您可以将类型限制更改为 list(object)
。如果你简化了你的数据结构,这样你就只有一个带有 cidr_block
和 display_name
键的对象列表,而不是一个带有键 cidr_blocks
的对象列表,它包含上述对象的列表,然后您甚至可以更准确地验证这一点:
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 通过从变量中删除 type
参数来自动推断预期的对象类型。然后,如果有人试图传入与默认 Terraform 类型不匹配的变量,则会在计划或验证时告诉您。