将复杂的非基本数据类型传递给Terraform模板提供程序
有这样一个更复杂的列表对象将复杂的非基本数据类型传递给Terraform模板提供程序,terraform,Terraform,有这样一个更复杂的列表对象 variable "proxy" { type = list(object({ enabled = bool host = string port = number user = string password = string })) default = [ { enabled = false host = "" port = 0 user = ""
variable "proxy" {
type = list(object({
enabled = bool
host = string
port = number
user = string
password = string
}))
default = [
{
enabled = false
host = ""
port = 0
user = ""
password = ""
}
]
}
data "template_file" "cloudinit_data" {
template = file("cloudinit.cfg")
vars = {
proxy = var.proxy
}
}
我想在外部模板中使用它(在我的例子中是cloudinit)。允许将变量传递给模板。遗憾的是,不适用于更复杂的类型:
请注意,变量必须都是原语。直接引用列表或映射将导致验证错误
像这样的
variable "proxy" {
type = list(object({
enabled = bool
host = string
port = number
user = string
password = string
}))
default = [
{
enabled = false
host = ""
port = 0
user = ""
password = ""
}
]
}
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 0.11编写的配置兼容。因为您使用的是Terraform 0.12,所以应该改用,它是语言的内置部分,支持所有值类型
因为templatefile
是一个函数,所以可以在需要表达式的任何地方调用它。如果要多次使用渲染结果,则可以将其定义为,例如:
locals {
cloudinit_data = templatefile("${path.module}/cloudinit.cfg", {
proxy = var.proxy
})
}
如果您只需要此结果一次——例如,如果您只是使用它来填充单个aws\u实例
资源的user\u数据
——那么您可以将此表达式内联写入资源块中,以将所有内容保持在一起,并使配置(主观上)更易于阅读:
resource "aws_instance" "example" {
# ...
user_data = templatefile("${path.module}/cloudinit.cfg", {
proxy = var.proxy
})
}
模板渲染器可能还不支持此功能,因此您必须在Terraform DSL中进行此操作。那么,当然有可能实现您想要做的事情。我如何访问代理变量以将其元素作为单个变量传递给模板?我试图找到相关文档,但谷歌似乎很难找到。您可以执行类似于
var.proxy[0][“host”]
的操作来访问数组0th
元素的host
键的值。这很有效,谢谢!我不需要数组,所以我将type=list(object({
改为type=object({
)。它可以工作,但就在我删除了默认值定义之后(也没有数组括号[]
)。使用默认值,我得到了一个无效的表达式,该表达式应为表达式的开头,但发现了一个无效的表达式标记错误。是否不能仅为不属于数组的对象定义一个默认值?这听起来像是语法问题,但我可以稍后自己尝试重新生成此值。对于像我这样的人来说,这真的很有帮助,因为他犯了错误正在为函数调用数据源,并想知道为什么它不起作用。