【问题标题】:expressions must have consistent types表达式必须具有一致的类型
【发布时间】:2022-01-23 20:08:52
【问题描述】:

我在运行 terraform 计划时遇到此错误:

│   on cluster/main.tf line 8, in locals:
│    8:   database = var.enabled ? var.config.database.mydb : {}
│     ├────────────────
│     │ var.config.database.mydb is object with 8 attributes
│     │ var.enabled is false
│ 
│ The true and false result expressions must have consistent types. The given
│ expressions are object and object, respectively.

启用是这样定义的:

variable "enabled" {
  type = bool
}

mydb 是应用程序的数据库。

想不出办法,其他问题上提出的解决方案(通过使用 tomap)稍后给我另一个问题

【问题讨论】:

  • 错误信息指出您的var.config.database.mydb 的类型与空的Map 构造函数{} 不一致。我们需要看到那个变量声明而不是enabled

标签: terraform terraform-provider-gcp


【解决方案1】:

Terraform 报告此错误是因为 {}var.config.database.mydb 的类型不同。该变量显然具有具有八个属性的对象类型,因此 Terraform 是正确的,没有属性的对象与其不兼容。

进行此通过类型检查的两个主要选项是使用一致类型的后备值,或使用null 在禁用时明确表示此值的缺失。


我无法显示第一个选项的完整示例,因为您的问题不包括 var.config 的类型约束,但假设该对象的八个属性仅称为 attr1 到 attr8 那么想法是写与提供的属性具有相同类型的合适占位符值:

  database = var.enabled ? var.config.database.mydb : {
    attr1 = false
    attr2 = 0
    attr3 = ""
    attr4 = null
    attr5 = toset([])
    attr6 = "placeholder"
    attr7 = "..."
    attr8 = 15
  }

第二个选项在您的局部变量表达式本身中更简单:

  database = var.enabled ? var.config.database.mydb : null

null 可以转换为任何类型,因此 Terraform 应该认为上述内容是有效的,但这确实意味着必须编写模块中其他任何引用 local.database 的表达式来处理它是 @ 的情况987654330@以及设置的情况。

一种方法是让引用使用the try function 来处理在访问null 上的属性时通常会发生的错误,并替换为备用值。例如:

  example = try(local.database.attr6, "placeholder")

请注意,无论example 参数是什么,我再次提供了一个有效的后备值,这意味着这将获得与为local.database 分配非空默认值的另一个选项相同的结果。此处的主要区别在于,如果您需要,对local.database 的每个引用都可能具有不同 后备值,而第一个选项将使对local.database 的所有引用的后备值保持一致。

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多