首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform YAML配置对象没有属性名。

Terraform YAML配置对象没有属性名。
EN

Stack Overflow用户
提问于 2022-05-10 09:01:18
回答 1查看 256关注 0票数 0

我正在努力调试yaml文件中的一个问题,该文件每个条目包含两个属性:

代码语言:javascript
复制
topics:
  - name: topic_one
    partitions: 24
  - name: topic_two
    partitions: 1
  - name: topic_three
    partitions: 12
  - name: topic_four
    partitions: 6

我把这个拉到TF里

代码语言:javascript
复制
locals {
  confluent = yamldecode(file("./confluent.yaml"))["topics"]

  confluent_topics = flatten([for topic in local.confluent :
  {
    "name"       = topic.name
    "partitions" = topic.partitions
  }])
}

进入模块时:

代码语言:javascript
复制
module "confluent" {
  source = "./modules/confluent-cloud"
  count  = var.confluent_cluster ? 1 : 0
  topics = local.confluent_topics
  
  region = var.region
}

然后在模块中:

代码语言:javascript
复制
resource "confluent_kafka_topic" "kafka" {
  for_each = {
    for topic in var.topics : topic.name => name
  }  

  kafka_cluster {
    id = confluent_kafka_cluster.kafka.id
  }
  topic_name = each.value.name
  partitions_count = each.value.partitions
  ...

我试过了几乎每一个组合,并且我已经将模块variables.tf中的变量类型设置为几乎所有可以想象的东西。但错误是,它认为对象没有一个名为partitions的属性--我尝试过简化本地而不平缓列表,我尝试了很多不同的变体。但总是这样;

代码语言:javascript
复制
│ Error: Unsupported attribute
│
│   on main.tf line 40, in locals:
│   40:     "partitions" = topic.partitions
│
│ This object does not have an attribute named "partitions".

控制台给了我:

代码语言:javascript
复制
> local.confluent
[
  {
    "name" = "topic_one"
    "partitions" = 24
  },
  {
    "name" = "topic_two"
    "partitions" = 1
  },
  {
    "name" = "topic_three"
    "partitions" = 12
  },
  {
    "name" = "topic_four"
    "partitions" = 6
  }

在扁平的本地控制台上只返回:

代码语言:javascript
复制
> local.confluent_topics
(known after apply)

...which有点令人费解,因为我认为它应该知道这一点,而不适用。我确信这不是我的问题。

最烦人的是我以前做过这件事。因此,我想知道这是否是TF版本的情况,必须以不同的方式处理?

代码语言:javascript
复制
❯ terraform version
Terraform v1.1.7
on darwin_arm64
+ provider registry.terraform.io/confluentinc/confluent v0.7.0
+ provider registry.terraform.io/hashicorp/aws v4.12.1
+ provider registry.terraform.io/hashicorp/kubernetes v2.11.0
+ provider registry.terraform.io/hashicorp/null v3.1.1
+ provider registry.terraform.io/hashicorp/random v3.1.3
+ provider registry.terraform.io/hashicorp/tls v3.3.0

Your version of Terraform is out of date! The latest version
is 1.1.9. You can update by downloading from https://www.terraform.io/downloads.html
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-10 09:49:48

您的逻辑都很好,除了循环属性name。您不能拥有name属性&从它获取partitions字段。它只能从topic对象中获取。

试试这个..。

代码语言:javascript
复制
resource "confluent_kafka_topic" "kafka" {
  for_each = {
    for topic in var.topics : topic.name => topic
  }  

  kafka_cluster {
    id = confluent_kafka_cluster.kafka.id
  }
  topic_name = each.value.name
  partitions_count = each.value.partitions
  ...

您有唯一的键形式的topic.name & topic是具有partitions字段的对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72183425

复制
相关文章

相似问题

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