Terraform 循环数据到动态块

问题描述

我正在构建一个 azure 模块来创建一个应用程序网关。这个模块看起来像这样:

resource "azurerm_application_gateway" "app_gateway" {
....
  dynamic "backend_address_pool" {
    for_each = var.backend_address_pools
    content {
      name         = backend_address_pool.value.name
      ip_addresses = lookup(backend_address_pool.value,"ip_addresses",null)
      fqdns        = lookup(backend_address_pool.value,"fqdns",[])
    }
  }

  dynamic "backend_http_settings" {
    for_each = var.backend_http_settings
    content {
      name                                = backend_http_settings.value.name
      cookie_based_affinity               = backend_http_settings.value.cookie_based_affinity
      port                                = backend_http_settings.value.port
      protocol                            = backend_http_settings.value.protocol
      request_timeout                     = backend_http_settings.value.request_timeout
      path                                = lookup(backend_http_settings.value,"path",null)
      probe_name                          = lookup(backend_http_settings.value,"probe_name",null)
      host_name                           = backend_http_settings.value.pick_host_name_from_backend_address ? null : backend_http_settings.value.host_name
      pick_host_name_from_backend_address = lookup(backend_http_settings.value,"pick_host_name_from_backend_address",false)
      affinity_cookie_name                = lookup(backend_http_settings.value,"affinity_cookie_name",null)
      trusted_root_certificate_names      = lookup(backend_http_settings.value,"trusted_root_certificate_names",[])
    }
  }
}
...

代码适用于输入变量,如大多数模块示例所示:

backend_address_pools = [
  {
    name  = local.ui-beap
    ip_addresses = null
    fqdns = ["UI_URL"]
  },{
    name  = local.api-beap
    ip_addresses = null
    fqdns = ["API_URL"]
  }
]

backend_http_settings = [
  {
    name = local.ui-htst
    path = "/"
    protocol = "https"
    request_timeout = 30
    probe_name = null
  },{
    name = local.api-htst
    path = "/api/"
    protocol = "https"
    request_timeout = 30
    probe_name = null
  }
]

我有一个要求,其中变量以列表的形式提供。例如,不创建模块的代码如下所示:

resource "azurerm_application_gateway" "ampapplgateway" {
...
  dynamic "backend_address_pool" {
    for_each = var.host_a_hostnames
    content {
      name = "${local.host_a_backend_address_pool_name}${local.host_a_cluster ? "" : index(var.host_a_hostnames,backend_address_pool.value)}"
    }
  }

  dynamic "backend_address_pool" {
    for_each = var.host_b_hostnames
    content {
      name = "${local.host_b_backend_address_pool_name}${local.host_b_cluster ? "" : index(var.host_b_hostnames,backend_address_pool.value)}"
    }
  }

dynamic "backend_http_settings" {
    for_each = var.host_a_hostnames
    content {
      cookie_based_affinity = "Enabled"
      name = "${local.host_a_http_setting_name}${local.host_a_cluster ? "" : index(var.host_a_hostnames,backend_http_settings.value)}"
      port = 8443
      request_timeout = 30
      protocol = "Https"
      affinity_cookie_name = "ApplicationGatewayAffinity"
      authentication_certificate {
        name = local.host_a_auth_certificate_name
      }
    }
  }

dynamic "backend_http_settings" {
    for_each = var.host_b_hostnames
    content {
      cookie_based_affinity = "Enabled"
      name = "${local.host_b_http_setting_name}${local.host_b_cluster ? "" : index(var.host_b_hostnames,backend_http_settings.value)}"
      port = 8443
      request_timeout = 30
      protocol = "Https"
      affinity_cookie_name = "ApplicationGatewayAffinity"
      authentication_certificate {
        name = local.host_b_auth_certificate_name
      }
    }
  }

我正在尝试以单个和多个主机名可以协同工作的方式构建此模块。我正在努力解决这个问题,但我不知道如何解决这个问题。

非常感谢任何帮助!!提前致谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)