合并terraform v0.12中的词典列表

时间:2020-03-05 02:25:38

标签: json terraform

我想使用Terraform进行以下操作:

我有2个JSON:

1.json:

[
    {
        "description": "description1",
        "url":         "url1",
        "data":        "data1"
    },
    {
        "description": "description2",
        "url":         "url2",
        "data":        "data2",
        "action":        "action2"
    },
    {
        "description": "description3",
        "url":         "url3",
        "data":        "data3"
    }
]

2.json:

[
    {  
        "description": "description1",
        "url":         "url1",
        "data":        "data1"
    },
    {
        "description": "description2_new",
        "url":         "url2",
        "data":        "data2_new"
    },
    {
        "description": "description4",
        "url":         "url4",
        "data":        "data4"
    }
]

,我想将它们合并为一个。如果 url 键相同,则第二个JSON的字典应覆盖第一个JSON的字典。即组合的JSON应该看起来像:

[
    {
        "description": "description1",
        "url":         "url1",
        "data":        "data1"
    },
    {
        "description": "description2_new",
        "url":         "url2",
        "data":        "data2_new"
    },
    {
        "description": "description3",
        "url":         "url3",
        "data":        "data3"
    },
    {
        "description": "description4",
        "url":         "url4",
        "data":        "data4"
    }
]

使用python,我可以轻松做到这一点:

import json
with open('1.json') as f:
  json1 = json.load(f)
with open('2.json') as f:
  json2 = json.load(f)


def list_to_dict(json_list):
    res_dict = {}
    for d in json_list:
        res_dict[d['url']] = d
    return res_dict

def merge_json(json1, json2):
    j1 = list_to_dict(json1)
    j2 = list_to_dict(json2)
    j1.update(j2)
    res_list = []
    for key in j1.keys():
        res_list.append(j1[key])
    return res_list


print(json.dumps(merge_json(json1, json2), indent=4))

如何使用terraform做到这一点?

1 个答案:

答案 0 :(得分:1)

使用Terraform 0.12.x

$ cat main.tf

locals {
  # read from files and turn into json
  list1 = jsondecode(file("1.json"))
  list2 = jsondecode(file("2.json"))
  # iterate over lists and turn url into a unique key
  dict1 = { for item in local.list1 : item.url => item }
  dict2 = { for item in local.list2 : item.url => item }
  # combine both dictionaries so values converge
  # only take its values
  merged = values(merge(local.dict1, local.dict2))
}

output "this" {
  value = local.merged
}
$ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

this = [
  {
    "data" = "data1"
    "description" = "description1"
    "url" = "url1"
  },
  {
    "data" = "data2_new"
    "description" = "description2_new"
    "url" = "url2"
  },
  {
    "data" = "data3"
    "description" = "description3"
    "url" = "url3"
  },
  {
    "data" = "data4"
    "description" = "description4"
    "url" = "url4"
  },
]