所以我有一个要像这样插值的变量:
variable "secondary_ranges" {
type = map(object({
secondary_range = object({
range_name = string
ip_cidr_range = string
})
}))
default = {
pods = {
secondary_range = {
range_name = "pods"
ip_cidr_range = "${var.some_other_var_or_datasource}"
}
}
services = {
secondary_range = {
range_name = "services"
ip_cidr_range = "${var.some_other_var_or_datasource}"
}
}
}
}
我可以在本地人中执行此操作,但是我松开了自定义类型定义
locals {
default = {
pods = {
secondary_range = {
range_name = "pods"
ip_cidr_range = "${var.some_other_var_or_datasource}"
}
}
services = {
secondary_range = {
range_name = "services"
ip_cidr_range = "${var.some_other_var_or_datasource}"
}
}
}
}
是否可以在本地应用自定义类型?
答案 0 :(得分:1)
通过包含一些类型转换函数(tomap
和tostring
),可以使局部值最终具有符合该变量类型约束的类型:
locals {
default = tomap({
pods = {
secondary_range = {
range_name = "pods"
ip_cidr_range = tostring(var.some_other_var_or_datasource)
}
}
services = {
secondary_range = {
range_name = "services"
ip_cidr_range = tostring(var.some_other_var_or_datasource)
}
}
})
}
{ ... }
语法创建对象类型的值,但是我们可以将此类对象传递给tomap
,以使Terraform将其转换为等效的地图类型。通过检查所有对象属性值是否具有相同的类型,然后选择该类型作为地图的元素类型来做到这一点,因此只要内部对象具有正确的结构,结果值将具有相同的类型。 / p>
在上面的示例中,我通过对两个变量引用中的每一个使用tostring
来帮助确保结果具有正确的类型。如果将该变量定义为type = string
,实际上并不需要,因为Terraform仍然会自动将其转换为字符串,但是如果您关心生成特定的结果类型,则将其明确也不会造成损害。
可以设置类型约束来帮助模块的调用者知道如何调用它,因此对于模块本身内定义的值,它没有直接等效的功能,但是如果您使用类型转换功能,像上面一样,您可以通过不同的方式获得相同的结果。
我个人通常不会过分担心局部值的类型,因为无论如何它们只会在当前模块中使用,但是我将更明确地说明输出值中的类型转换,以便调用者可以得到更好的结果。发出有关如何使用该值的信号,以便将来的更改不太可能无意间导致输出值更改为其他类型。