You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中如何从结构不一致的多层嵌套HCL对象中统一提取id属性值

Terraform中如何从结构不一致的多层嵌套HCL对象中统一提取id属性值

这种结构不统一的状态输出确实挺闹心的,尤其是你还不想把OCI的全量数据都塞进状态文件里,完全理解你想高效提取所有id的需求。我来给你一个具体的实现思路,用Terraform的内置函数组合就能搞定:

首先,先把你拿到的原始输出整理成可参考的代码块(方便后续对应):

variable "instances" {
  type = any
  default = [
    {
      "details" = {
        "controllers" = {
          "pri" = {
            "hostname" = "XXXXXXXXXdc001"
            "id" = "some_long_ocid_1"
            "ip" = "xxx.xxx.xxx.xxx"
          }
          "sec" = {
            "hostname" = "XXXXXXXXXdc002"
            "id" = "some_long_ocid_2"
            "ip" = "xxx.xxx.xxx.xxx"
          }
        }
        "domain" = "xxxxxxxxxxxxx.org"
        "smbdomain" = "XXXXX"
      }
    },
    {
      "xxxxxxxxxxxx000" = {
        "id" = "some_long_ocid_3"
        "ip" = "xxx.xxx.xxx.xxx"
      }
    },
    {
      "xxxxxxxxxxxx001" = {
        "id" = "some_long_ocid_4"
        "ip" = "xxx.xxx.xxx.xxx"
      }
    }
  ]
}

接下来,你可以通过local变量结合for表达式、flatten、contains这些函数,针对两种不同的结构分别处理,最终统一提取所有id:

locals {
  instance_ids = flatten([
    for item in var.instances : [
      # 处理域控那种带details多层嵌套的结构
      if contains(keys(item), "details") => [
        item.details.controllers.pri.id,
        item.details.controllers.sec.id
      ],
      # 处理单键值对的普通实例结构
      true => [
        for val in values(item) : val.id
      ]
    ]
  ])
}

代码解释:

  1. 外层用for item in var.instances遍历每一个实例对象;
  2. 对每个对象先判断:如果包含details键,就直接从多层嵌套里取出主备域控的id;
  3. 如果是普通实例结构(顶层只有一个实例名称键),就用values(item)拿到键对应的对象值,再提取其中的id;
  4. 最后用flatten把所有分散的id数组“拉平”成一个一维数组,正好得到你想要的格式:
    "instances" = [
      "some_long_ocid_1",
      "some_long_ocid_2",
      "some_long_ocid_3",
      "some_long_ocid_4"
    ]
    

如果后续还有其他结构的实例输出,你只需要扩展这个条件判断逻辑就行——比如用try函数来容错,避免因为结构异常报错,或者添加更多的if分支处理特殊情况。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:28:13