代码之家  ›  专栏  ›  技术社区  ›  Suman Ghosh

尝试通过terraform解析json输入文件

  •  0
  • Suman Ghosh  · 技术社区  · 1 年前

    我对terraform非常陌生,正在尝试理解它。我正在尝试解析一个示例json文件,并尝试显示键和值。到目前为止,我已经完成了以下操作,但不起作用。任何帮助都将不胜感激。

    example.json :

    {
        "Clients":[
            {
                "alias": "XXX-ED",
                "name": "XXX-ED | XXX Cloud | Dev/Test",
                "prefix": "xxxed",
                "id": 12345,
                "cluster": 3,
                "ZoneName": "East US 2",
                "EnvironmentName": "Dev/Test",
                "AzureSubscriptionID": "xxxxxx-xxxx-xxxxx-xxxx-xxxxxx",
                "AzureDirectory": "xxxxxx.onmicrosoft.com",
                "AzureTenantID": "xxxxxx-xxxx-xxxxx-xxxx-xxxxxx"
            },
            {
                "alias": "XXX-EM",
                "name": "XXX-EM | XXX Cloud | Management",
                "prefix": "xxxem",
                "id": null,
                "cluster": null,
                "ZoneName": "East US 2",
                "EnvironmentName": "Management",
                "AzureSubscriptionID": "xxxxxx-xxxx-xxxxx-xxxx-xxxxxx",
                "AzureDirectory": "xxxxxx.onmicrosoft.com",
                "AzureTenantID": "xxxxxx-xxxx-xxxxx-xxxx-xxxxxx"
            }
        ]
    }
    

    地形代码

    data "local_file" "input"{
      filename = "${path.module}/example.json"
    }
    
    locals {
      raw_json_object = jsondecode(data.local_file.input.content)
      root_node       = flatten(local.raw_json_object["Clients"])
      
      expected_output = [
        for clients in local.root_node :[
          for key in clients:
            key.AzureDirectory
          ]
        ]
      }
    }
    
    output "raw_content" {
      value = local.expected_output
    }
    

    获取以下错误

    计划失败。Terraform在生成此计划时遇到错误。错误:main.tf第38行上不支持的属性,在locals:38:key中。AzureDirectory 无法访问基元类型值(字符串)上的属性。

    1 回复  |  直到 1 年前
        1
  •  2
  •   Marko E    1 年前

    在本地测试表明,您可以在不必引用密钥的情况下实现所需内容,因此这应该有效:

    locals {
      raw_json_object = jsondecode(data.local_file.input.content)
      root_node       = flatten(local.raw_json_object["Clients"])
      expected_output = [for client in local.root_node : client.AzureDirectory]
    }
    
    output "raw_content" {
      value = local.expected_output
    }
    

    哪些输出:

    local.expected_output
    [
      "xxxxxx.onmicrosoft.com",
      "xxxxxx.onmicrosoft.com",
    ]
    

    被压扁的 root_node 局部变量是映射的列表,这意味着您需要访问列表中的每个元素(即, client )然后这些元素中的每一个都有一个名为 AzureDirectory 。换句话说,您只需要在列表中循环一次,并访问列表中每个元素的所需键。

    附带说明一下,当使用局部变量时,也可以使用 terraform console 命令而不是输出。