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

如何在Terraform中合并两个JSON输出为指定结构?解决值覆盖问题

Terraform 合并两个JSON输出为指定结构

问题场景

现有两个JSON结构的输出,需合并为包含ansible_playbook与external_ip字段的目标结构,解决合并时的值覆盖或冗余键问题:

现有输出1(含Playbook配置)

"test_01": {
  "app-server": {
    "ansible_playbook": "playbook.yml"
  },
  "db-server": {
    "ansible_playbook": "playbook-02.yml"
  }
}

现有输出2(含IP配置)

"test_02": {
  "app-server": {
    "external_ip": "app-ip"
  },
  "db-server": {
    "external_ip": "db-ip"
  }
}

期望目标输出

"test_01": {
  "app-server": {
    "ansible_playbook": "playbook.yml",
    "external_ip": "app-ip"
  },
  "db-server": {
    "ansible_playbook": "playbook-02.yml",
    "external_ip": "db-ip"
  }
}

解决方案

利用Terraform的merge函数结合for_each遍历节点,精准合并对应服务器的字段:

示例配置

假设输入数据来自本地变量(若为资源输出,替换为对应资源引用即可):

locals {
  # 输入1:Playbook配置数据
  playbook_config = {
    "test_01" = {
      "app-server" = {
        "ansible_playbook" = "playbook.yml"
      },
      "db-server" = {
        "ansible_playbook" = "playbook-02.yml"
      }
    }
  }

  # 输入2:IP配置数据
  ip_config = {
    "test_02" = {
      "app-server" = {
        "external_ip" = "app-ip"
      },
      "db-server" = {
        "external_ip" = "db-ip"
      }
    }
  }

  # 核心合并逻辑
  merged_result = {
    "test_01" = {
      # 遍历所有服务器节点,逐个合并对应字段
      for server_name, _ in local.playbook_config.test_01 :
      server_name => merge(
        local.playbook_config.test_01[server_name],
        local.ip_config.test_02[server_name]
      )
    }
  }
}

# 输出合并后的结果
output "final_merged_output" {
  value = local.merged_result
}

关键说明

  • for_each遍历第一个输入中的服务器节点,确保每个节点都被单独处理,避免顶层键冲突
  • merge函数针对单个服务器节点合并字段,保证ansible_playbook和external_ip不会互相覆盖
  • 若输入来自资源输出(比如模块输出、数据源结果),只需将local.playbook_config和local.ip_config替换为对应的资源引用路径即可

内容的提问来源于stack exchange,提问作者Rostyslav Malenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:11:28