我似乎无法弄清楚如何循环访问 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.
我稍微修改了您的代码(仅
main.tf
文件),以便能够在我的本地计算机中运行 terraform plan
,但它应该很容易理解如何使其工作。
请注意,我使用了最新版本的
azurerm
提供程序 (v3.101.0
)。
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 {
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
}
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.