【问题标题】:Terraform: Object List Value Has No AttributesTerraform:对象列表值没有属性
【发布时间】: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 区域的示例。感谢您的意见。

标签: terraform terraform-provider-azure


【解决方案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”的属性。您可以在我对代码的回答中复制粘贴数据和本地块跨度>
  • 原来我有各种各样的错别字。它现在正在完全工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2022-01-20
相关资源
最近更新 更多