Bertanya-tanya apakah ada yang berlari mengatasinya. Jadi, saya harus dapat membuat daftar blok CIDR jalan keluar yang saat ini tersedia untuk dicantumkan melalui API. Contoh keluaran adalah sebagai berikut:

[
   {
      "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"
      }
    }
  ]

Jadi, saya perlu mengonversinya ke Azure Firewall

###############################################################################
# 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"]
  }
}

Jadi, intinya adalah bahwa alamat IP yang diizinkan harus berupa daftar string untuk parameter "source_addresses", seperti ini:

["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",]

Saya mengonfigurasi file data_sources.tf:

data "http" "allowed_networks_v1" {
  url = "https://testapiserver.com/api/allowed/networks/v1"
}

...dan di locals.tf, saya perlu mengonfigurasi

locals {

  allowed_networks_json     = jsondecode(data.http.allowed_networks_v1.body)
  egress_ips = ...
}

...dan di situlah saya terjebak. Bagaimana cara mengurai data tersebut dalam file locals.tf sehingga saya dapat mereferensikannya dari dalam TF ?

Terima kasih satu metrik ton!!

1
user2362699 9 April 2021, 01:03

1 menjawab

Jawaban Terbaik

Saya berasumsi bahwa daftar string yang Anda maksud adalah objek di bawah: metadata.cidr kita dapat mengekstraknya dengan perulangan for di lokal, dan juga melakukan pembedaan untuk berjaga-jaga jika kita mendapatkan duplikat.

Berikut adalah contoh kode

data "http" "allowed_networks_v1" {
  url = "https://raw.githack.com/heldersepu/hs-scripts/master/json/networks.json"
}

locals {
  allowed_networks_json = jsondecode(data.http.allowed_networks_v1.body)

  distinct_cidrs = distinct(flatten([
    for key, value in local.allowed_networks_json : [
      value.metadata.cidr
    ]
  ]))
}

output "data" {
  value = local.distinct_cidrs
}

Dan inilah output dari rencana itu:

terraform plan

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:

Terraform will perform the following actions:

Plan: 0 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + data = [
      + "192.168.1.128/26",
      + "192.168.160.0/25",
    ]

Berikut adalah kode untuk sampel kedua Anda:

data "http" "allowed_networks_v1" {
  url = "https://raw.githack.com/akamalov/testfile/master/networks.json"
}

locals {
  allowed_networks_json = jsondecode(data.http.allowed_networks_v1.body)

  distinct_cidrs = distinct(flatten([
    for key, value in local.allowed_networks_json.egress_nat_ranges : [
      value.metadata.cidr
    ]
  ]))
}

output "data" {
  value = local.distinct_cidrs
}
2
Helder Sepulveda 9 April 2021, 00:29