地形计划错误“功能”:未设置必填字段

时间:2020-02-28 06:29:49

标签: terraform infrastructure-as-code

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 /模块/vnet-main/Azure-terraform-azurerm-vnet-e0b9155/main.tf 第3行,在资源“ azurerm_resource_group”“ vnet”中:3:名称
=“ $ {var.resource_group_name}”

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

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

最终出现以下错误:

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

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

Fix "Interpolation-only expressions are deprecated" warning in Terraform

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

在main.tf第6行上,在变量“ resource_group_name”中:6:键入 =字符串

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

2 个答案:

答案 0 :(得分:2)

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

provider "azurerm" {
  version = "=2.4.0"
  features {}
}

答案 1 :(得分: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)周围的引号。可以在module's source中看到它。

您唯一真正的选择是派生模块并修复警告/升级或打开PR,并希望维护者合并(尽管看起来该回购交易已有两年没有活动了。)

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

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

因此,使用以下命令应该可以解决此错误

provider "azurerm" {
  features {}
}

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

main.tf第6行,在变量“ resource_group_name”中:6:类型=字符串

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

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