0

我正在尝试传递一个列表类型的变量,如下所示:

cf-app.tf文件中:

resource "cloudfoundry_app" "my-app" {

service_binding = "${var.service-bindings}"

}

variables.tf文件中:

variable "service-bindings" {
  type = "list"
  default = []
}

deployment.tf文件中:

module "nested-module" {
source = "../my-app"

  service-bindings = [
    {
      service_instance = "dummy1"
    },
    {
      service_instance = "dummy2"
    }
  ]

}

但我收到以下错误,这是一个已知terraform 11问题,已修复terraform 12

Error: module.nested-module.cloudfoundry_app.myapp: service_binding: should be a list

我关注了这个问题,但我的挑战是一系列元素......

我目前正在使用terraform version 11.

有人可以帮我解决这个问题吗?

先感谢您!

4

2 回答 2

1

Terraform v0.11 的类型系统不支持这种嵌套数据结构。它仅支持字符串、字符串列表和字符串映射。

因此,您在此处的示例结合了 Terraform v0.11 不太适合支持的各种功能,而这正是促使为 Terraform v0.12 重写 Terraform 语言的那种限制。

对于您的情况,我最好的建议是放弃将其分解resource "cloudfoundry_app" "my-app"为共享模块的想法,而是直接将其编写为内联资源,并在其中直接指定您需要的设置:

resource "cloudfoundry_app" "my-app" {
  service_binding {
    service_instance = "dummy1"
  }

  service_binding {
    service_instance = "dummy2"
  }
}

一旦您准备好升级到更现代的 Terraform 版本,您可以将其重写为一个块,以根据您的输入变量dynamic生成多个块,然后考虑将其分解到一个单独的模块中,一旦您可以使用足够表达的Terraform 语言版本:service_binding

# This configuration is only for Terraform v0.12 or later

variable "service_bindings" {
  type = list(object({
    service_instance = string
    params_json      = string
  }))
}

resource "cloudfoundry_app" "my-app" {
  dynamic "service_binding" {
    for_each = var.service_bindings
    content {
      service_instance = service_binding.value.service_instance
      params_json      = service_binding.value.params_json
    }
  }
}
于 2021-07-21T17:02:12.567 回答
0

为什么你有:

service_binding = "${var.service-bindings}"

什么时候var.service-bindings是一个列表并且service_binding输入需要一个列表?这不应该是:

service_binding = var.service-bindings

我没有安装 Terraform v0.11,也无意安装它来测试它,但您可以尝试:

  1. type = "list"从您的变量中删除。如果您不要求它验证类型是否正确,它还会抛出此错误吗?

  2. 0.11是否支持该jsonencode功能?如果是这样,请尝试:

resource "cloudfoundry_app" "my-app" {
  service_binding = jsondecode(var.service-bindings)
}

variable "service-bindings" {
  type = "string"
  default = "[]"
}
module "nested-module" {
  source = "../my-app"

  service-bindings = jsonencode([
    {
      service_instance = "dummy1"
    },
    {
      service_instance = "dummy2"
    }
  ])
}
于 2021-07-19T23:05:07.463 回答