如何在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
相关产品推荐
相关产品推荐

