在Terraform中获取变量的类型

时间:2019-10-10 16:25:08

标签: terraform

有没有一种方法可以检测Terraform中变量的类型?说,我有一个any类型的模块输入变量,可以根据类型进行某种切换吗?

variable "details" {
  type = any
}

local {
  name = var.details.type == map ? var.details["name"] : var.details
}

我想要存档的是,能够将字符串作为速记或带有其他键的复杂对象传递。

module "foo" {
  details = "my-name"
}

module "foo" {
  details = {
    name = "my-name"
    age = "40"
  }
}

我知道这个例子没有多大意义,您建议使用两个输入变量作为默认变量。该示例仅简化为最小(非)工作示例。最终目标是拥有IAM策略声明的列表,因此它将成为对象列表的列表。

1 个答案:

答案 0 :(得分:1)

没有基于Terraform中的类型切换行为的机制。通常,Terraform倾向于选择特定的类型,以便模块调用程序始终保持一致,并且Terraform可以完全验证给定的值,即使在较简单的情况下这意味着额外的冗长。

我建议只将details定义为一个对象,并让调用者使用name属性显式地写出该对象,以便更加明确和一致:

variable "details" {
  type = object({
    name = string
  })
}
module "example" {
  source = "./modules/example"

  details = { name = "example" }
}

如果需要支持两种不同的类型,那么Terraform语言中最接近的一件事就是定义两个变量并检测哪个是null

variable "details" {
  type = object({
    name = string
  })
  default = null
}

variable "name" {
  type    = string
  default = null
}

local {
  name = var.name != null ? var.name : var.details.name
}

但是,由于当前没有一种方法可以表示必须指定这两者中的一个,因此您编写的模块配置必须准备就绪,以应对可能同时设置两者的情况(在上面的示例中,{{1 }}具有优先级),也不会设置任何优先级(在上面的示例中,该表达式会产生错误,但不会引起调用者的注意)。