【问题标题】:Pass complex, non-primitive data types to Terraform template provider将复杂的非原始数据类型传递给 Terraform 模板提供程序
【发布时间】: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”:需要字符串。

这引出了两个问题:

  1. 如何将变量传递给模板?我假设我需要将它转换为这样的原始类型:

    vars = {
        proxy_host = var.proxy.host
    }
    

这不起作用:

这个值没有任何属性。

  1. 是否有其他方法可以将此对象直接传递给模板?

我正在使用 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


【解决方案1】:

template_file 数据源继续存在只是为了与为 Terraform 0.11 编写的配置兼容。由于您使用的是 Terraform 0.12,因此您应该改用 the templatefile function,它是语言的内置部分,支持所有值类型。

因为templatefile 是一个函数,您可以在任何需要表达式的地方调用它。如果你想多次使用渲染结果,那么你可以将其定义为named local value,例如:

locals {
  cloudinit_data = templatefile("${path.module}/cloudinit.cfg", {
    proxy = var.proxy
  })
}

如果你只需要这个结果一次——例如,如果你只是用它来填充单个aws_instance资源的user_data——那么你可以把这个表达式内联写在资源块中,将所有内容放在一起并使配置(主观上)更易于阅读:

resource "aws_instance" "example" {
  # ...

  user_data = templatefile("${path.module}/cloudinit.cfg", {
    proxy = var.proxy
  })
}

【讨论】:

  • 对像我这样误认为函数的数据源并想知道为什么它不起作用的人真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2010-09-15
  • 1970-01-01
  • 2012-11-25
  • 2020-03-03
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多