循环 terraform 中 azurerm_route 中的路由列表

问题描述 投票:0回答:1

我似乎无法弄清楚如何循环访问 azurerm_route 资源块中的一组路由。路由表资源由 300 多个路由组成,我需要一种方法来迭代路由,因为它们会随着时间的推移添加/删除。

数据.tf

data "azurerm_resource_group" "lab-rg" {
  name = var.resource_group_name
}

data "azurerm_route_table" "lab-rt" {
  name                = var.rtLab1
  resource_group_name = data.azurerm_resource_group.lab-rg.name
}

main.tf

resource "azurerm_route" "lab-rt1-routes" {
  #for_each = var.route_table["${var.rtLab1}"].routes
  for_each = {for idx, route in var.route_table["${var.rtLab1}"].routes: route => idx}
  resource_group_name = azurerm_route_table.lab-rt.resource_group_name
  route_table_name    = azurerm_route_table.lab-rt.name

  name = each.value.name 
  address_prefix = each.value.addressPrefix
  next_hop_type = each.value.nextHopType
  next_hop_in_ip_address = each.value.nextHopIpAddress
}

变量.tf

variable "resource_group_name" {
  default = null
}
variable "location" {
  default = null
}
variable "tags" {
  type    = map(string)
  default = null
}

variable "rtLab1" {
  default = null  
}

variable "rtLab2" {
  default = null
}

variable "route_table" {
  description = "Route table configuration"
  type = map(object({
    routes = list(object({
      name             = string
      addressPrefix    = string
      nextHopType      = string
      nextHopIpAddress = string
    }))
  }))
} 

terraform.tfvars

resource_group_name = "ACE-L-PALMS-RGP-07-002"
location            = "eastus2"
rtLab1 = "ACE-L-SNT-LAB-UDR-001"
rtLab2 = "ACE-L-SNT-LAB-UDR-002"
route_table = {
  "ACE-L-SNT-LAB-UDR-001" = {
    routes = [
      {
        name             = "Default-0.0.0.0_0-Route",
        addressPrefix    = "0.0.0.0/0",
        nextHopType      = "VirtualAppliance",
        nextHopIpAddress = "xxx.xxx.xxx.xxx"
      },
      {
        name             = "On-Prem-Route1",
        addressPrefix    = "xxx.xxx.xxx.xxx/24",
        nextHopType      = "VirtualAppliance",
        nextHopIpAddress = "xxx.xxx.xxx.xxx"
      },
      {
        name             = "On-Prem-Route2",
        addressPrefix    = "xxx.xxx.xxx.xxx/24",
        nextHopType      = "VirtualAppliance",
        nextHopIpAddress = "xxx.xxx.xxx.xxx"
      }]
  },
  "ACE-L-SNT-LAB-UDR-002" = {
    routes = [
      {
        addressPrefix    = "0.0.0.0/0"
        name             = "Default-0.0.0.0_0-Route"
        nextHopIpAddress = "VirtualAppliance"
        nextHopType      = "xxx.xxx.xxx.xxx"
      }
    ]
  }
}

不确定如何循环遍历资源“azurerm_route”“lab-rt1-routes”块中的列表(对象)。每次尝试更改 for_each 循环时,我都会收到不同的错误。无论哪种方式,它似乎都无法获取其所在的特定路由表中的路由。有没有办法循环这些路由并仅提取要在 azurerm_route 资源块中使用的路由。 tfvars 文件,我简化为 3 条路由,但实际上,需要将超过 350 条路由添加到路由表中。

错误原样

terraform plan
╷
│ Error: Invalid reference
│
│   on main.tf line 13, in resource "azurerm_route" "lab-rt1-routes":
│   13:   for_each = {for idx, route in var.route_table["${var.rtLab1}"].routes: route => idx}
│
│ A reference to a resource type must be followed by at least one attribute access, specifying the resource name.
azure terraform
1个回答
0
投票

我稍微修改了您的代码(仅

main.tf
文件),以便能够在我的本地计算机中运行
terraform plan
,但它应该很容易理解如何使其工作。

请注意,我使用了最新版本的

azurerm
提供程序 (
v3.101.0
)。

变量.tf

variable "resource_group_name" {
  default = null
}
variable "location" {
  default = null
}
variable "tags" {
  type    = map(string)
  default = null
}

variable "rtLab1" {
  default = null
}

variable "rtLab2" {
  default = null
}

variable "route_table" {
  description = "Route table configuration"
  type = map(object({
    routes = list(object({
      name             = string
      addressPrefix    = string
      nextHopType      = string
      nextHopIpAddress = string
    }))
  }))
}

主.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.101.0"
    }
  }
}

provider "azurerm" {
  features {}
}

# Uncomment this part
# data "azurerm_resource_group" "lab-rg" {
#   name = var.resource_group_name
# }

# data "azurerm_route_table" "lab-rt" {
#   name                = var.rtLab1
#   resource_group_name = data.azurerm_resource_group.lab-rg.name
# }

locals {
  selected_rt1_routes = var.route_table[var.rtLab1].routes
}

resource "azurerm_route" "lab-rt1-routes" {
  for_each = {
    for route in local.selected_rt1_routes : route.name => route
  }

  resource_group_name = var.resource_group_name # azurerm_route_table.lab-rt.resource_group_name
  route_table_name    = var.rtLab1              # azurerm_route_table.lab-rt.name

  name                   = each.value.name
  address_prefix         = each.value.addressPrefix
  next_hop_type          = each.value.nextHopType
  next_hop_in_ip_address = each.value.nextHopIpAddress
}

terraform.tfvars

resource_group_name = "ACE-L-PALMS-RGP-07-002"
location            = "eastus2"
rtLab1              = "ACE-L-SNT-LAB-UDR-001"
rtLab2              = "ACE-L-SNT-LAB-UDR-002"

route_table = {
  "ACE-L-SNT-LAB-UDR-001" = {
    routes = [
      {
        name             = "Default-0.0.0.0_0-Route",
        addressPrefix    = "0.0.0.0/0",
        nextHopType      = "VirtualAppliance",
        nextHopIpAddress = "xxx.xxx.xxx.xxx"
      },
      {
        name             = "On-Prem-Route1",
        addressPrefix    = "xxx.xxx.xxx.xxx/24",
        nextHopType      = "VirtualAppliance",
        nextHopIpAddress = "xxx.xxx.xxx.xxx"
      },
      {
        name             = "On-Prem-Route2",
        addressPrefix    = "xxx.xxx.xxx.xxx/24",
        nextHopType      = "VirtualAppliance",
        nextHopIpAddress = "xxx.xxx.xxx.xxx"
    }]
  },
  "ACE-L-SNT-LAB-UDR-002" = {
    routes = [
      {
        addressPrefix    = "0.0.0.0/0"
        name             = "Default-0.0.0.0_0-Route"
        nextHopIpAddress = "VirtualAppliance"
        nextHopType      = "xxx.xxx.xxx.xxx"
      }
    ]
  }
}

跑步
terraform plan
:

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # azurerm_route.lab-rt1-routes["Default-0.0.0.0_0-Route"] will be created
  + resource "azurerm_route" "lab-rt1-routes" {
      + address_prefix         = "0.0.0.0/0"
      + id                     = (known after apply)
      + name                   = "Default-0.0.0.0_0-Route"
      + next_hop_in_ip_address = "xxx.xxx.xxx.xxx"
      + next_hop_type          = "VirtualAppliance"
      + resource_group_name    = "ACE-L-PALMS-RGP-07-002"
      + route_table_name       = "ACE-L-SNT-LAB-UDR-001"
    }

  # azurerm_route.lab-rt1-routes["On-Prem-Route1"] will be created
  + resource "azurerm_route" "lab-rt1-routes" {
      + address_prefix         = "xxx.xxx.xxx.xxx/24"
      + id                     = (known after apply)
      + name                   = "On-Prem-Route1"
      + next_hop_in_ip_address = "xxx.xxx.xxx.xxx"
      + next_hop_type          = "VirtualAppliance"
      + resource_group_name    = "ACE-L-PALMS-RGP-07-002"
      + route_table_name       = "ACE-L-SNT-LAB-UDR-001"
    }

  # azurerm_route.lab-rt1-routes["On-Prem-Route2"] will be created
  + resource "azurerm_route" "lab-rt1-routes" {
      + address_prefix         = "xxx.xxx.xxx.xxx/24"
      + id                     = (known after apply)
      + name                   = "On-Prem-Route2"
      + next_hop_in_ip_address = "xxx.xxx.xxx.xxx"
      + next_hop_type          = "VirtualAppliance"
      + resource_group_name    = "ACE-L-PALMS-RGP-07-002"
      + route_table_name       = "ACE-L-SNT-LAB-UDR-001"
    }

Plan: 3 to add, 0 to change, 0 to destroy.
© www.soinside.com 2019 - 2024. All rights reserved.