首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:属性值类型不正确。属性“name”的不适当值:所需字符串

错误:属性值类型不正确。属性“name”的不适当值:所需字符串
EN

Stack Overflow用户
提问于 2022-03-23 09:13:02
回答 1查看 1.7K关注 0票数 0

我无法使用type = list(map(string))在vnet中创建4个子网

代码语言:javascript
复制
Error: Incorrect attribute value type
│
│   on .terraform/modules/subnet1-app1/virtual-network/subnet/main.tf line 3, in resource "azurerm_subnet" "subnet":
│    3:   name                 = var.subnet_name
│     ├────────────────
│     │ var.subnet_name is a list of map of string, known only after apply
│
│ Inappropriate value for attribute "name": string required.



boilerplate

        |_ providers.tf
        |_ locals.tf
        |_ resource_groups.tf
        |_ vnets.tf
        |_ subnets.tf
        |_ terraform.tfvars
        |_ variables.tf
    
    modules
    |_ resource-group
              |_ main.tf
              |_ outputs.tf
              |_ variables.tf

    |_ virtual-network
              |_ main.tf
              |_ outputs.tf
              |_ variables.tf

          |_ subnet
              |_ main.tf
              |_ outputs.tf
              |_ variables.tf

modules/terraform-azure-module-resourcegroup/main.tf

代码语言:javascript
复制
resource "azurerm_resource_group" "rg" {
  name     = var.resource_group_name
  location = var.location
  tags     = var.tags
}

modules/terraform-azure-module-resourcegroup/outputs.tf

代码语言:javascript
复制
# Output Variables of the module

output "resource_group_name" {
  value       = azurerm_resource_group.rg.name
  description = "name of resource group"
}

output "location" {
  value       = azurerm_resource_group.rg.location
  description = "location of resource group"
}

modules/terraform-azure-module-resourcegroup/variables.tf

代码语言:javascript
复制
# Input Variables of the module

variable "resource_group_name" {
  type        = string
  description = "name of resource group"
}

variable "location" {
  type        = string
  description = "location of resource group"
}

variable "tags" {
  type    = map(any)
  default = {}
}

modules/terraform-azure-module-network/virtual-network/main.tf

代码语言:javascript
复制
# Create the Virtual Network
resource "azurerm_virtual_network" "vnet" {
  name                = var.vnet_name
  location            = var.vnet_location
  resource_group_name = var.resource_group_name
  address_space       = var.vnet_address_space
  dns_servers         = var.dns_servers
}

modules/terraform-azure-module-network/virtual-network/outputs.tf

代码语言:javascript
复制
# Vnet Outputs

# output "vnet_id" {
#   description = "The id of the newly created vNet"
#   value       = azurerm_virtual_network.vnet.id
# }

output "vnet_name" {
  description   = "The Name of the newly created vNet"
  value         = azurerm_virtual_network.vnet.name
}

output "vnet_location" {
  description   = "The location of the newly created vNet"
  value         = azurerm_virtual_network.vnet.location
}

# output "vnet_address_space" {
#   description   = "The address space of the newly created vNet"
#   value         = azurerm_virtual_network.vnet.address_space
# }

modules/terraform-azure-module-network/virtual-network/variables.tf

代码语言:javascript
复制
# Vnet Variables

variable "vnet_location" {
  type        = string
  description = "Location of environment"
}

variable "resource_group_name" {
  type        = string
  description = "name of resource group"
}

variable "vnet_name" {
  type        = string
  description = "Name of Virtual Network"
}

variable "vnet_address_space" {
  type        = list(any)
  description = "Address space of Virtual Network"
}

variable "dns_servers" {
  type        = list(any)
  description = "Dns servers for Virtual Network"
}

modules/terraform-azure-module-network/virtual-network/subnet/main.tf

代码语言:javascript
复制
# Create the Subnet
resource "azurerm_subnet" "subnet" {
  name                 = var.subnet_name
  resource_group_name  = var.resource_group_name
  virtual_network_name = var.vnet_name
  address_prefixes     = var.subnet_address_prefixes
}

modules/terraform-azure-module-network/virtual-network/subnet/variables.tf

代码语言:javascript
复制
variable "subnet_name" {
# type = map(string)
# type        = string
type        = list(map(string))
}

variable "resource_group_name" {
  type        = string
  description = "name of resource group"
}

variable "subnet_address_prefixes" {
  type                 = list(any)
  description          = "Address prefixes of Subnet"
}

variable "vnet_name" {
  type                 = string
  description          = "Name of Virtual Network"
}

订阅/样板/Providers.tf

代码语言:javascript
复制
# Terraform Block
terraform {
  required_version = ">= 1.0.0"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 2.0"
    }
  }
}

# Provider Block
provider "azurerm" {
  subscription_id = "*"
  features {}
}

订阅/样板/locals.tf

代码语言:javascript
复制
locals {
  resource_group_name = "rg-${var.environment}-${var.project_office}-${var.asset_name}"
  vnet_name           = "vn-${var.environment}-${var.project_office}-${var.asset_name}"
  location            = var.location
}

订阅/样板/资源组

代码语言:javascript
复制
module "rg-app1" {
  source = "git::ssh://git@ssh.dev.azure.com/v3/*/*/terraform-azure-module-resourcegroup"
  resource_group_name = local.resource_group_name
  location            = local.location
  tags                = var.tags

}

订阅/样板/网络

代码语言:javascript
复制
module "vnet-app1" {
  source              = "git::ssh://git@ssh.dev.azure.com/v3/*/*/terraform-azure-module-network//virtual-network"
  vnet_name           = local.vnet_name
  vnet_location       = module.rg-app1.location
  resource_group_name = module.rg-app1.resource_group_name
  vnet_address_space  = var.vnet_address_space
  dns_servers         = var.dns_servers

  depends_on = [module.rg-app1]
}


module "subnet1-app1" {
  source = "git::ssh://git@ssh.dev.azure.com/v3/*/*/terraform-azure-module-network//virtual-network/subnet"
  for_each = var.subnet_name

  resource_group_name     = module.rg-app1.resource_group_name
  vnet_name               = module.vnet-app1.vnet_name
  subnet_name             = each.value.name
  subnet_address_prefixes = each.value.subnet_address_prefixes

  depends_on = [
    module.rg-app1,
    module.vnet-app1
  ]
}

订阅/样板/Terraform.tfvars

代码语言:javascript
复制
location       = "Australia Southeast"
environment    = "d"
project_office = "O1"
asset_name     = "boilerplate"

tags = {
  env     = "dev"
  project = "azure refresh"
}

vnet_address_space = ["10.1.0.0/16"]
dns_servers        = ["1.1.1.1", "4.4.4.4"]

# subnet_address_prefixes = ["10.1.0.0/24"]

subnet_name = [
  {
    name                    = "web"
    subnet_address_prefixes = "10.1.1.0/24"
  },
  {
    name                    = "app"
    subnet_address_prefixes = "10.1.2.0/24"
  },
  {
    name                    = "data"
    subnet_address_prefixes = "10.1.3.0/24"
  },
  # The name must be AzureBastionSubnet
  {
    name             = "AzureBastionSubnet"
    address_prefixes = "10.1.250.0/24"
  }
]

订阅/样板/Variables.tf

代码语言:javascript
复制
# Resource Group Variables

variable "location" {
  type        = string
  description = "location of resource group"
}

variable "tags" {
  type    = map(any)
  default = {}
}

variable "project_office" {
  description = "Project Office Name"
  type        = string
}

variable "environment" {
  description = "Environment Name"
  type        = string
}

variable "asset_name" {
  description = "Project Office Name"
  type        = string
}

# Vnet & Subnet Variables

variable "vnet_address_space" {
  type        = list(any)
  description = "Address space of Virtual Network"
}

variable "dns_servers" {
  type        = list(any)
  description = "Dns servers for Virtual Network"
}

variable "subnet_name" {
  # type = map(string)
  type        = list(map(string))
}

启用导出TF_LOG=DEBUG时的错误消息

代码语言:javascript
复制
[ERROR] vertex "module.subnet1-app1.azurerm_subnet.subnet" error: Incorrect attribute value type
EN

回答 1

Stack Overflow用户

发布于 2022-03-23 10:13:09

您所共享的错误是对注释输出行的错误,这一点很明显,因为它为属性提供了期望字符串的列表。

在此属性的新行中,您有:

代码语言:javascript
复制
subnet_name             = each.value.subnet_name

但应该是:

代码语言:javascript
复制
subnet_name             = each.value.name

因为'name‘是地图的一部分,而不是subnet_name。subnet_name是变量的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71584565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档