【发布时间】:2020-02-12 02:32:42
【问题描述】:
有一个像这样更复杂的列表对象
variable "proxy" {
type = list(object({
enabled = bool
host = string
port = number
user = string
password = string
}))
default = [
{
enabled = false
host = ""
port = 0
user = ""
password = ""
}
]
}
我想在外部模板中使用它(在我的例子中是 cloudinit)。 template_file directive 允许将变量传递给模板。可悲的是,不适用于更复杂的类型:
请注意,变量必须都是原语。直接引用列表或地图会导致验证错误。
像这样的
data "template_file" "cloudinit_data" {
template = file("cloudinit.cfg")
vars = {
proxy = var.proxy
}
}
导致错误
属性“vars”的值不合适:元素“proxy”:需要字符串。
这引出了两个问题:
-
如何将变量传递给模板?我假设我需要将它转换为这样的原始类型:
vars = { proxy_host = var.proxy.host }
这不起作用:
这个值没有任何属性。
- 是否有其他方法可以将此对象直接传递给模板?
我正在使用 v0.12.17。
【问题讨论】:
-
模板渲染器可能还不支持此功能,因此您必须在 Terraform DSL 中进行。那么肯定有可能实现你想要做的。
-
如何访问代理变量以将其元素作为单个变量传递给模板?
-
我试图找到它的文档,但谷歌似乎很难。您将执行类似
var.proxy[0]["host"]的操作来访问数组的0th元素处的host键的值。 -
这行得通,谢谢!我不需要数组,所以我将
type = list(object({更改为type = object({。它可以工作,但就在我删除了default值定义之后(也没有数组括号[])。使用默认值,我得到 Invalid expression Expected the start of an expression, but found an invalid expression token 错误。是否不能只为不属于数组的对象定义默认值? -
这听起来像是语法问题,但我可以稍后自己尝试重现。
标签: terraform