Ошибка плана terraform "features": не заполнено обязательное поле
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"
наконец, ошибка ниже:
Ошибка: "возможности": не заполнено обязательное поле
Согласно предложению, упомянутому в статье stackru ниже, если я запустил команду обновления (terraform 0.12upgrade
) для обновления до 0.12 появляется ошибка ниже:
Исправить предупреждение "Выражения только для интерполяции устарели" в Terraform
Ошибка: синтаксическая ошибка в файле конфигурации
в main.tf строке 6 в переменной "resource_group_name": 6: type = string
Ошибка при разборе: 6:11: неизвестный токен: 6:11 IDENT строка
2 ответа
Эй, ты должен указать features
заблокируйте, как показано ниже, чтобы исправить проблему
provider "azurerm" {
version = "=2.4.0"
features {}
}
Кажется, здесь есть несколько проблем, но не обязательно прямой вопрос, поэтому я попробую по каждой из них. Обратите внимание, что вам НЕ НУЖНО исправлять предупреждения, а только ошибки, хотя рекомендуется исправление обоих.
Предупреждение: выражения, предназначенные только для интерполяции, устарели
В более новых версиях 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 и надеяться, что сопровождающие объединятся (хотя похоже, что это репо не было активным в течение 2 лет).
Ошибка: "возможности": не заполнено обязательное поле
Это настоящая ошибка, которую вы, вероятно, хотите исправить. Ответ прост: у вашего провайдера отсутствуют необходимыеfeatures
блок (он может быть даже пустым).
Таким образом, использование следующего должно исправить эту ошибку
provider "azurerm" {
features {}
}
Ошибка: синтаксическая ошибка в файле конфигурации
в main.tf строке 6 в переменной "resource_group_name": 6: type = string
Ошибка при разборе: 6:11: неизвестный токен: 6:11 IDENT строка
Я считаю, что проблема здесь в том, что команда обновления ожидает, что терраформа, которая обновляется, будет действительной. 0.11
код. И в0.11
, то type
ожидается, что поля будут иметь string
значения (например, "map"
, "string"
, так далее...).