0

terraform init初始化成功,下面是我的main.tf

############################################################################
# VARIABLES
#############################################################################

variable "resource_group_name" {
  type  = string
}

variable "location" {
  type    = string
  default = "eastus"
}


variable "vnet_cidr_range" {
  type    = string
  default = "10.0.0.0/16"
}

variable "subnet_prefixes" {
  type    = list(string)
  default = ["10.0.0.0/24", "10.0.1.0/24"]
}

variable "subnet_names" {
  type    = list(string)
  default = ["web", "database"]
}

#############################################################################
# PROVIDERS
#############################################################################

provider "azurerm" {

}

#############################################################################
# RESOURCES
#############################################################################

module "vnet-main" {
  source              = "Azure/vnet/azurerm"
  resource_group_name = var.resource_group_name
  location            = var.location
  vnet_name           = var.resource_group_name
  address_space       = var.vnet_cidr_range
  subnet_prefixes     = var.subnet_prefixes
  subnet_names        = var.subnet_names
  nsg_ids             = {}

  tags = {
    environment = "dev"
    costcenter  = "it"

  }
}

#############################################################################
# OUTPUTS
#############################################################################

output "vnet_id" {
  value = module.vnet-main.vnet_id
}

当我运行terraform plan -var resource_group_name=vnet-main -out vnet.tfplan 得到以下警告时:

警告:仅插值表达式已弃用

在 .terraform/modules/vnet-main/Azure-terraform-azurerm-vnet-e0b9155/main.tf 第 3 行,在资源“azurerm_resource_group”“vnet”中:3:name
=“${var.resource_group_name}”

警告:引用类型约束已弃用

在 .terraform/modules/vnet-main/Azure-terraform-azurerm-vnet-e0b9155/variables.tf 第 39 行,在变量“nsg_ids”中:39:type = “map”

终于得到以下错误:

错误:“功能”:未设置必填字段

根据下面 stackoverflow 文章中提到的建议,如果我运行升级命令 ( terraform 0.12upgrade) 升级到 0.12,则出现以下错误:

修复 Terraform 中的“仅插值表达式已弃用”警告

错误:配置文件中的语法错误

在 main.tf 第 6 行,在变量“resource_group_name”中:6:type = string

解析时出错:在 6:11:未知令牌:6:11 IDENT 字符串

4

2 回答 2

6

嘿,你必须features像下面这样指定块来解决这个问题

provider "azurerm" {
  version = "=2.4.0"
  features {}
}
于 2020-04-07T11:17:29.667 回答
1

这里似乎有一些问题,但不一定是直接的问题,所以我会逐一介绍。请注意,您不需要修复警告,只需修复错误,但建议同时修复两者。

警告:仅插值表达式已弃用

在较新版本的 terraform 中,应直接传递资源属性,而不是将它们包装在插值中。

也一样

resource "my_resource" "name" {
  some_attr = var.some_value
}

代替

resource "my_resource" "name" {
  some_attr = "${var.some_value}"
}

除非实际上需要字符串插值来从其他值构建字符串。

警告:引用类型约束已弃用

在 .terraform/modules/vnet-main/Azure-terraform-azurerm-vnet-e0b9155/variables.tf 第 39 行,在变量“nsg_ids”中:39:type = “map”

看起来您所依赖的模块与您正在使用的 terraform 版本不兼容(至少从“警告”的角度来看)。

这种特定的抱怨是因为它在类型周围使用引号map(例如"map",而不仅仅是map)。这可以看出它是模块的源代码

您在这里唯一真正的选择是分叉模块并修复警告/升级或打开 PR 并希望维护者合并(尽管看起来该 repo 已经有 2 年没有活动了)。

错误:“功能”:未设置必填字段

这是我认为您可能正在寻求解决的真正错误。答案很简单,您的提供者缺少所需的features(这甚至可以是空的)。

因此,使用以下内容应该可以解决此错误

provider "azurerm" {
  features {}
}

错误:配置文件中的语法错误

在 main.tf 第 6 行,在变量“resource_group_name”中:6:type = string

解析时出错:在 6:11:未知令牌:6:11 IDENT 字符串

我认为这里的问题是升级命令期望正在升级的 terraform 是有效0.11代码。在 中0.11type字段应具有string值(例如"map""string"等...)。

于 2020-02-28T14:15:16.187 回答