如何在Terraform的Harness Provider块中动态读取JSON的org值?
解决Terraform动态读取JSON中嵌套对象的org值问题
你的问题核心是JSON结构里applications数组的每个元素都是单键对象(比如{"abc": {...}}),直接用索引访问org会失败,因为数组元素本身不包含org键,org在这个单键对象的值里。下面是具体的解决方法:
步骤1:解析JSON数据
首先确保把HTTP返回的字符串格式JSON解析成Terraform可操作的对象结构:
data "http" "myapi" { url = "你的API地址" } locals { # 解析HTTP返回的JSON字符串 parsed_data = jsondecode(data.http.myapi.body) }
步骤2:动态提取所有org值
用values()函数提取每个单键对象里的实际内容,再用flatten()把嵌套数组展开,就能得到包含所有app和org的一维列表:
locals { # 提取所有包含app和org的对象 app_details = flatten([ for app_obj in local.parsed_data.applications : values(app_obj) ]) # 获取所有org值的列表 all_orgs = local.app_details[*].org # 取第一个org值(对应myorg_a) first_org = local.app_details[0].org }
步骤3:在Harness Provider中使用
直接引用本地变量即可,无需硬编码键名:
provider "harness" { # 示例:使用第一个org值 org_id = local.first_org # 其他配置... }
进阶:根据app名称匹配org
如果需要根据app字段的值(比如myapp)动态获取对应的org,可以构建一个映射表:
locals { app_to_org = { for item in local.app_details : item.app => item.org } # 获取myapp对应的org(myorg_a) target_org = local.app_to_org["myapp"] }
为什么之前的方法报错?
你尝试的(data.http.myapi.body).applications[0]["org"]失败,是因为applications[0]是{"abc": {"app": "myapp", "org": "myorg_a"}}这个对象,它的键是abc而不是org,自然找不到对应值。values()函数的作用就是忽略这个动态的键名,直接取出对象里的实际内容。
内容的提问来源于stack exchange,提问作者user3526896
相关产品推荐
相关产品推荐

