将复杂的非基本数据类型传递给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({
    )。它可以工作,但就在我删除了
    默认值定义之后(也没有数组括号
    []
    )。使用默认值,我得到了一个无效的表达式,该表达式应为表达式的开头,但发现了一个无效的表达式标记错误。是否不能仅为不属于数组的对象定义一个默认值?这听起来像是语法问题,但我可以稍后自己尝试重新生成此值。对于像我这样的人来说,这真的很有帮助,因为他犯了错误正在为函数调用数据源,并想知道为什么它不起作用。