Terraform:对象列表值没有属性
Posted
技术标签:
【中文标题】Terraform:对象列表值没有属性【英文标题】:Terraform: Object List Value Has No Attributes 【发布时间】:2022-01-19 15:32:45 【问题描述】:在 Terraform 计划中出现错误,说我的对象没有名称值的属性。我们正在部署大约 7 个私有 dns 区域,其中许多位于同一个资源组中。有些人可能住在其他人,但大多数人住在同一个。
Error: Unsupported attribute
on Modules/privatednszone/main.tf line 4, in data "azurerm_resource_group" "this":
name = each.value.name
This value does not have any attributes.
主要
terraform
required_providers
azurerm =
source = "hashicorp/azurerm"
version = "2.83.0"
provider "azurerm"
features
variable "private_dns_zones"
type = map(object(
dns_zone_name = string
resource_group_name = string
tags = map(string)
vnet_links = list(object(
zone_to_vnet_link_name = string
vnet_name = string
networking_resource_group = string
zone_to_vnet_link_exists = bool
vnet_link_rg_name = string
))
zone_exists = bool
registration_enabled = bool
))
description = "Map containing Private DNS Zone Objects"
default =
data "azurerm_resource_group" "this"
# read from local variable, index is resource_group_name
for_each = local.rgs_map
name = each.value.name
locals
rgs_map =
for n in var.private_dns_zones :
n.resource_group_name =>
name = n.resource_group_name
output "rgs_map"
value = local.rgs_map
output "rg_data"
value = data.azurerm_resource_group.this
TFVARS 下面的代码是两个 dns 区域的示例,但还有其他的。
private_dns_zones =
zone1 =
dns_zone_name = "privatelink.vaultcore.azure.net"
resource_group_name = "Terraform1"
tags =
iac = "Terraform"
syntax = "zone1"
zone_exists = false
vnet_links = [
zone_to_vnet_link_name = "vaultcore-vnet-eastus2-01"
vnet_name = "vnet-eastus2-01"
networking_resource_group = "Terraform1"
zone_to_vnet_link_exists = false
vnet_link_rg_name = "Terraform1"
]
registration_enabled = false
,
zone2 =
dns_zone_name = "privatelink.monitor.azure.com"
resource_group_name = "Terraform1"
tags =
iac = "Terraform"
syntax = "zone2"
zone_exists = false
vnet_links = [
zone_to_vnet_link_name = "monitor-vnet-eastus2-01"
vnet_name = "vnet-eastus2-01"
networking_resource_group = "Terraform1"
zone_to_vnet_link_exists = false
vnet_link_rg_name = "Terraform1"
]
registration_enabled = false
【问题讨论】:
您是否为该变量提供输入值,因为默认为空 Map,这会导致您的错误? 我们有一个 tfvars 文件,其中列出了大约 7 个私有 dns 区域。我错报了我原来的问题。它不是一个列表,而是一个对象图。 `var.private_dns_zones`的实际值是多少? 您好@Vegas588,您能否也将 tfvars 文件添加到问题中 嗨@AnsumanBal-MT 我已经添加了 tfvars 文件,其中包含两个私有 dns 区域的示例。感谢您的意见。 【参考方案1】:您的代码似乎只有在我使用不同的资源组名称时才能正常工作。由于您使用的是资源组名称的重复值,因此您无法使用您的代码创建地图"rgs_map"
,因为它会出现以下错误:
所以,为了解决上述错误,我使用了类似以下的方法:
locals
rgs_map =
for i,n in var.private_dns_zones : "$i" =>
name = n.resource_group_name
完整代码:
terraform
required_providers
azurerm =
source = "hashicorp/azurerm"
version = "2.83.0"
provider "azurerm"
features
variable "private_dns_zones"
type = map(object(
dns_zone_name = string
resource_group_name = string
tags = map(string)
vnet_links = list(object(
zone_to_vnet_link_name = string
vnet_name = string
networking_resource_group = string
zone_to_vnet_link_exists = bool
vnet_link_rg_name = string
))
zone_exists = bool
registration_enabled = bool
))
description = "Map containing Private DNS Zone Objects"
default =
data "azurerm_resource_group" "this"
# read from local variable, index is resource_group_name
for_each = local.rgs_map
name = each.value.name
locals
rgs_map =
for i,n in var.private_dns_zones : "$i" =>
name = n.resource_group_name
output "rgs_map"
value = local.rgs_map
output "rg_data"
value = data.azurerm_resource_group.this
输出:
【讨论】:
谢谢。我现在明白了。由于地图使用索引,您必须使用它来区分不同的 RG。有道理。 我仍然收到错误消息。 Modules/privatednszone/main.tf 第 4 行。 each.value 是具有 6 个属性的对象。该对象没有名为“name”的属性。 请检查本地的 for 循环,因为您指的是不存在的名为“name”的属性。您可以在我对代码的回答中复制粘贴数据和本地块跨度> 原来我有各种各样的错别字。它现在正在完全工作。谢谢。以上是关于Terraform:对象列表值没有属性的主要内容,如果未能解决你的问题,请参考以下文章
Terraform 是不是支持带有少量操作的 CloudFormation 模板
需要说明如何使用 Terraform 管理 Google Cloud 项目
使用 Terraform 删除以前的快照并创建 EBS 卷的新快照
将现有 GKE 集群添加到 terraform stat 文件