有没有办法使用其名称设置 Terraform 资源属性?

时间:2021-03-31 14:35:13

标签: terraform

有没有办法使用名称设置 Terraform 资源属性?

我想使用包含地图/对象的地图变量,并想使用循环根据该对象动态设置资源的属性。

基本上可以做类似 helm_release 的设置机制(https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release):

resource "helm_release" "example" {
  name       = "my-redis-release"
  ...
  set {
    name  = "cluster.enabled"
    value = "true"
  }

理想情况下,我想做一些事情,例如将 .yaml 作为映射/对象加载到变量中,然后在循环中的模块中使用该变量来设置资源属性:

var.attributes = { a = 4, d = 2 }

resource "type" "name" {
   for_each = var.attributes
   .. 
   self[each.key]    = each.value
} 

我使用的是 terraform 0.14。

1 个答案:

答案 0 :(得分:0)

Terraform 无法从其他地方的数据完全动态地生成资源块的参数。

Terraform 语言表达式允许您动态设置特定参数的值,但参数本身必须始终静态设置,因为 Terraform 中的资源对象更像是通用语言中的结构或类,而不是一个字典或地图,您可以在其中自由设置您喜欢的任何键。

最接近您在问题中包含的内容的是一个资源,其中明确列出了参数,但它们的值从变量中分配,如下所示:

resource "type" "name" {
  a = var.attributes.a
  b = var.attributes.b
} 

Terraform 然后将静态验证您指定的所有参数都是资源类型的有效参数,并且您分配给每个参数的表达式符合预期的类型约束。