从Terraform 0.11升级到0.12期间的列表问题

从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 = [

我在尝试重写列表以在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 = [
        { 
          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升级已经有很长时间了,但我认为这是该工具的默认行为。