0

我尝试了几种方法来遍历 yaml 中的地图,但每个结果我都不断收到错误,例如:local.settings 是带有 # attributes 的对象。

从这里开始是我的 yaml 和 locals 设置

config:
    params:
        server:
            host: 127.0.0.1
            port: 8080
        media:
            name: foobar
            type: html
        s3:
            bucket: foobarbucket
            uploadFolder: folderfoobar
            type:
              public: false
        email:
            to: noreply@foobar.com
        
            

locals {
    settings = yamldecode(file("test.yaml"))
}

module "store_write" {
  source  = "cloudposse/ssm-parameter-store/aws"
  for_each = local.settings.variables

  parameter_write = [
    {
      name        = "/settings/${each.key}(i need each param key name ex: server)/${each.key.NEXTKET}(then the following key name after ex:host)"
      value       = "${each.key.value}(that keys value, ex: 127.0.0.1)"
      type        = "String"
      overwrite   = "true"
      description = "Terraform deployed param: ${local.app_name} ${each.key}"
    }
  ]

}

现在我当然会得到从 yaml 文件中解码的内容的输出,但是我尝试的每个 for 循环都不起作用。在这一点上,我什至找不到足够干净的 1 可以粘贴在这里。我不认为我可以实现我需要的,如果有时关键名称例如:s3 或电子邮件随着时间的推移而改变,对吗?

也注意到有时我可能会得到 3 个级别,

  config:
    params:
         s3:
         bucket: foobarbucket
         uploadFolder: folderfoobar
         type:
           public: false

我进一步尝试了以下操作,不得不稍微编辑 yaml 文件。但现在我得到了重复

locals {
  params = yamldecode(file("./test.yaml"))["app"]
  folder_project_apis = flatten([
    for fk, param in local.params : [
      for pk, config in param.params : [
        for lk, name in config  : [
            for vk, value in config : {
            key1  = fk
            key2 = pk
            key3 = lk
            value = value
          }
        ]
      ]
    ]
  ])
}

使用新的 yaml 结构

app:
  testing: #fk
    display_name: "Folder A"
    parent: 
    params: 
      server: #pk
        host:
          - 127.0.0.1
        port:
          - 3000
      s3:
        layout:
          - "uploads"
        image:
          - "total"

输出

> local.folder_project_apis
[
  {
    "key1" = "testing"
    "key2" = "s3"
    "key3" = "image"
    "value" = [
      "total",
    ]
  },
  {
    "key1" = "testing"
    "key2" = "s3"
    "key3" = "image"
    "value" = [
      "uploads",
    ]
  },
  {
    "key1" = "testing"
    "key2" = "s3"
    "key3" = "layout"
    "value" = [
      "total",
    ]
  },
  {
    "key1" = "testing"
    "key2" = "s3"
    "key3" = "layout"
    "value" = [
      "uploads",
    ]
  },
  {
    "key1" = "testing"
    "key2" = "server"
    "key3" = "host"
    "value" = [
      "127.0.0.1",
    ]
  },
  {
    "key1" = "testing"
    "key2" = "server"
    "key3" = "host"
    "value" = [
      3000,
    ]
  },
  {
    "key1" = "testing"
    "key2" = "server"
    "key3" = "port"
    "value" = [
      "127.0.0.1",
    ]
  },
  {
    "key1" = "testing"
    "key2" = "server"
    "key3" = "port"
    "value" = [
      3000,
    ]
  },
]
4

1 回答 1

1

如果我理解正确,您想遍历文件“test.yaml”中的映射并访问对象?你可以在下面做。

输出.tf

output host{
   value = local.settings.params.server.host
}

output email {
   value = local.settings.params.email
}

地形输出

email = {
  "to" = "noreply@foobar.com"
}
host = "127.0.0.1"

而且您担心如果更改键值,则无法访问上述 yaml 对象的解析,是的,这是正确的。

例如,如果我在给定文件中将“s3”更改为“s4”并应用 terraform。

  • s3 的整个键值被删除并插入 s4
      ~ params = {
          - s3     = {
              - bucket       = "foobarbucket"
              - uploadFolder = "folderfoobar"
            } -> null
          + s4     = {
              + bucket       = "foobarbucket"
              + uploadFolder = "folderfoobar"
            }
            # (3 unchanged elements hidden)
        }
    }
于 2022-02-23T22:09:28.583 回答