首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用terraform0.11传递元素列表

无法使用terraform0.11传递元素列表
EN

Stack Overflow用户
提问于 2021-07-20 06:15:21
回答 2查看 35关注 0票数 0

我尝试传递一个list类型的变量,如下所示:

cf-app.tf文件中:

代码语言:javascript
复制
resource "cloudfoundry_app" "my-app" {

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

}

variables.tf文件中:

代码语言:javascript
复制
variable "service-bindings" {
  type = "list"
  default = []
}

deployment.tf文件中:

代码语言:javascript
复制
module "nested-module" {
source = "../my-app"

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

}

但是我得到了下面的错误,这是一个已知的terraform 11问题,已经在terraform 12中修复了。

代码语言:javascript
复制
Error: module.nested-module.cloudfoundry_app.myapp: service_binding: should be a list

我关注了this issue,但我的挑战是使用元素字符串...

我目前使用的是terraform version 11

有没有人能帮我解决这个问题?

提前谢谢你!

EN

回答 2

Stack Overflow用户

发布于 2021-07-22 01:02:13

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

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

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

代码语言:javascript
复制
resource "cloudfoundry_app" "my-app" {
  service_binding {
    service_instance = "dummy1"
  }

  service_binding {
    service_instance = "dummy2"
  }
}

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

代码语言:javascript
复制
# 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
    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2021-07-20 07:05:07

为什么你会有:

代码语言:javascript
复制
service_binding = "${var.service-bindings}"

var.service-bindings是一个列表而service_binding输入需要一个列表时?这不应该是:

代码语言:javascript
复制
service_binding = var.service-bindings

我还没有安装Terraform v0.11,我也不打算安装它来测试它,但是你可以试试:

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

  1. 0.11是否支持jsonencode函数?如果是这样,请尝试:

代码语言:javascript
复制
resource "cloudfoundry_app" "my-app" {
  service_binding = jsondecode(var.service-bindings)
}

variable "service-bindings" {
  type = "string"
  default = "[]"
}
代码语言:javascript
复制
module "nested-module" {
  source = "../my-app"

  service-bindings = jsonencode([
    {
      service_instance = "dummy1"
    },
    {
      service_instance = "dummy2"
    }
  ])
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68447559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档