有没有一种方法可以检测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策略声明的列表,因此它将成为对象列表的列表。
答案 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 }}具有优先级),也不会设置任何优先级(在上面的示例中,该表达式会产生错误,但不会引起调用者的注意)。