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 文件

使用 github-script@v5 操作提取 terraform 资源更改

如何在Ansible set_fact中使用fact?