【问题标题】:Terraform iterate over a nested iterateTerraform 迭代嵌套迭代
【发布时间】:2021-06-21 13:14:31
【问题描述】:

我有这个 terraform 代码,它有两个动态块:


# block one
  dynamic "backend_address_pool" {
    for_each = var.backend_pools

    content {
      name      = each.key
      fqdns     = each.value["fqdns"]
      ip_addresses = each.value["ip_addresses"]
    }
  }    

# block two
  dynamic "request_routing_rule" {
    for_each = var.request_routing_rules

    content {
      name      = each.key
      rule_type     = each.value["rule_type"]
      http_listener_name = each.value["http_listener_name"]
      backend_address_pool_name = <How to get the names of the block1's address pools here>
      backend_http_settings_name = each.value["backend_http_settings_name"]
    }
  }

block1 中,我迭代了多个地址池,即pool1pool2pool3 等等,在block2 中,我需要获取每个块迭代的值和将其分配给block2 中的值backend_address_pool_name

我该怎么做?

那么在block2 中,有没有一种方法可以将每次迭代的值引用为dynamic.backend_address_pool 并分配给block2 中的值backend_address_pool_name

这是我的variables.tf

variable "backend_pools" {
  type = map(object({
    name         = string
    fqdns        = list(string)
    ip_addresses = list(string)
  }))

  description = "The configuration for backend pools"
}

variable "request_routing_rules" {
  type = map(object({
    rule_type                  = string
    http_listener_name         = string
    backend_address_pool_name  = string
    backend_http_settings_name = string
  }))

  description = "The configuration of routing rules for backend pools"
}

这是我的variables.tfvars

backend_pools = {
    pool1 = {
      fqdns        = ["some-value1", "some-value2", "some-value3"]
      ip_addresses = ["10.0.0.0"]
    },
    pool2 = {
      fqdns        = ["some-value1", "some-value2", "some-value3"]
      ip_addresses = ["10.0.0.0"]
    },
    pool3 = {
      fqdns        = ["some-value1", "some-value2", "some-value3"]
      ip_addresses = ["10.0.0.0"]
    }        
}

request_routing_rules = { 
    pool1 = {
      rule_type                  = "Basic"
      http_listener_name         = ""
      backend_address_pool_name  = ""
      backend_http_settings_name = ""
    },
    pool2 = {
      rule_type                  = "Basic"
      http_listener_name         = ""
      backend_address_pool_name  = ""
      backend_http_settings_name = ""
    }
    pool3 = {
      rule_type                  = "Basic"
      http_listener_name         = ""
      backend_address_pool_name  = ""
      backend_http_settings_name = ""
    }        
 }

【问题讨论】:

  • 您能否在原始帖子中举例说明每个动态块的变量输入是什么样的?
  • 我更新了帖子@rk92
  • 谢谢,backend_address_pool_name = fqdns 在您的示例中也是如此,还是您只是想从backend_poolspool1pool2 等)获取池的名称?
  • 是的,试图获取池的名称(pool1、pool2 等)
  • 您的问题的直接答案在文档中:terraform.io/docs/language/expressions/dynamic-blocks.html。但是,像这样在嵌套迭代器中匹配两个Map 是危险的,您应该考虑将request_routing_rules 作为object 嵌套在backend_pools 中。这将更安全,更容易实施。

标签: terraform


【解决方案1】:

要添加到我上面的评论中,您可以尝试以下操作:

backend_pool_and_request_routing_rules = { 
    pool1 = {
      fqdns                     = ["some-value1", "some-value2", "some-value3"]
      ip_addresses               = ["10.0.0.0"]
      rule_type                  = "Basic"
      http_listener_name         = ""
      backend_address_pool_name  = ""
      backend_http_settings_name = ""
    },

# block one
  dynamic "backend_address_pool" {
    for_each = var.backend_pool_and_request_routing_rules

    content {
      name      = each.key
      fqdns     = each.value["fqdns"]
      ip_addresses = each.value["ip_addresses"]
    }
  }    

# block two
  dynamic "request_routing_rule" {
    for_each = var.backend_pool_and_request_routing_rules

    content {
      name      = each.key
      rule_type     = each.value["rule_type"]
      http_listener_name = each.value["http_listener_name"]
      backend_address_pool_name = each.key
      backend_http_settings_name = each.value["backend_http_settings_name"]
    }
  }

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 2017-04-20
    • 2014-10-22
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多