Terraform locals.tf文件-解析JSONECODE正文

Terraform locals.tf文件-解析JSONECODE正文,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,想知道是否有人跑去解决它。所以,我需要能够生成当前可通过API列出的出口CIDR块列表。示例输出如下所示: [ { "description": "blahnet-public-acl", "metadata": { "broadcast": "192.168.1.191", "cidr": "192.16

想知道是否有人跑去解决它。所以,我需要能够生成当前可通过API列出的出口CIDR块列表。示例输出如下所示:

[
   {
      "description": "blahnet-public-acl",
      "metadata": {
        "broadcast": "192.168.1.191",
        "cidr": "192.168.1.128/26",
        "ip": "192.168.1.128",
        "ip_range": {
          "start": "192.168.1.128",
          "end": "192.168.1.191"
        },
        "netmask": "255.255.255.192",
        "network": "192.168.1.128",
        "prefix": "26",
        "size": "64"
      }
    },
    {
      "description": "blahnet-public-acl",
      "metadata": {
        "broadcast": "192.168.160.127",
        "cidr": "192.168.160.0/25",
        "ip": "192.168.160.0",
        "ip_range": {
          "start": "192.168.160.0",
          "end": "192.168.160.127"
        },
        "netmask": "255.255.255.128",
        "network": "192.168.160.0",
        "prefix": "25",
        "size": "128"
      }
    }
  ]
所以,我需要将其转换为Azure防火墙

###############################################################################
# Firewall Rules - Allow Access To TEST VMs
###############################################################################

resource "azurerm_firewall_network_rule_collection" "azure-firewall-azure-test-access" {
  for_each = local.egress_ips
  name                = "azure-firewall-azure-test-rule"
  azure_firewall_name = azurerm_firewall.public_to_test.name
  resource_group_name = var.resource_group_name
  priority            = 105
  action              = "Allow"

  rule {
    name = "test-access"
    source_addresses = local.egress_ips[each.key]
    destination_ports = ["43043"]
    destination_addresses = ["172.16.0.*"]
    protocols = [ "TCP"]
  }
}
因此,底线是允许的IP地址必须是“源地址”参数的字符串列表,例如:

["192.168.44.0/24","192.168.7.0/27","192.168.196.0/24","192.168.229.0/24","192.168.138.0/25",]
我配置了数据源.tf文件:

data "http" "allowed_networks_v1" {
  url = "https://testapiserver.com/api/allowed/networks/v1"
}
…在locals.tf中,我需要配置

locals {

  allowed_networks_json     = jsondecode(data.http.allowed_networks_v1.body)
  egress_ips = ...
}
…这就是我被困的地方。如何解析locals.tf文件中的数据,以便从tf中引用它


谢谢一公吨

我假设您所引用的字符串列表是以下对象:
metadata.cidr
我们可以在本地使用for循环提取该字符串,还可以执行一个独特的操作,以防得到重复的字符串

下面是一个示例代码

data“http”允许\u网络\u v1{
url=”https://raw.githack.com/heldersepu/hs-scripts/master/json/networks.json"
}
当地人{
allowed\u networks\u json=jsondecode(data.http.allowed\u networks\u v1.body)
不同的cidrs=不同的(变平([
对于键,local.allowed\u networks\u json中的值:[
value.metadata.cidr
]
]))
}
输出“数据”{
值=local.distinct\u cidrs
}
这是一个计划的输出:

地形图

已生成执行计划,如下所示。
资源操作用以下符号表示:
Terraform将执行以下操作:
计划:0添加,0更改,0销毁。
产出的变化:
+数据=[
+ "192.168.1.128/26",
+ "192.168.160.0/25",
]

以下是第二个示例的代码:

data“http”允许\u网络\u v1{
url=”https://raw.githack.com/akamalov/testfile/master/networks.json"
}
当地人{
allowed\u networks\u json=jsondecode(data.http.allowed\u networks\u v1.body)
不同的cidrs=不同的(变平([
对于键,local.allowed\u networks\u json.expresss\u nat\u范围内的值:[
value.metadata.cidr
]
]))
}
输出“数据”{
值=local.distinct\u cidrs
}

元数据.cidr是您需要提取的吗?谢谢您的及时回复。想知道,你在运行什么TF版本吗?@user2362699我得到了
terraformv0.14.5
非常感谢,赫尔德!!您可以试试这个文件吗:看起来它找不到一个属性,因为键“cidr”在一个名为“exgress\u nat\u ranges”的数组中。我试图将locals.tf条目更改为“value.express\u nat\u ranges.metadata.cidr”,但找不到它:(@user2362699 look-in-concat: