Terraform azure 不兼容的提供程序版本
Terraform azure Incompatible provider version
当我尝试初始化 terraform 时,我仅在使用 vnet 模块时遇到以下错误,
但是使用 azure_resource_group、azure_virtual_machine 模块
的地形初始化
Terraform 0.13 及更早版本允许在
provider 配置块,但现在已弃用并将被删除
在未来版本的 Terraform 中。要消除此警告,请移动提供者
required_providers 块中的版本约束。
错误:无法查询可用的提供程序包
无法检索提供程序的可用版本列表
hashicorp/azure: 提供商注册表 registry.terraform.io 没有
提供者名为 registry.terraform.io/hashicorp/azure
如果您刚刚从 Terraform v0.12 直接升级到 Terraform v0.14
那么请先升级到 Terraform v0.13 并按照升级指南进行操作
那个版本,它可能会帮助你解决这个问题。
您打算使用 terraform-providers/azure 吗?如果是这样,您必须指定
需要该提供程序的每个模块中的源地址。看看哪个
模块目前依赖于 hashicorp/azure、
enter image description here
enter image description here
main.tf
resource "azurerm_virtual_network" "vnet" {
for_each = { for n in var.networks : n.name => n }
name = each.value.name
address_space = each.value.address_space
location = each.value.location
resource_group_name = each.value.rg_name
dynamic "subnet" {
for_each = each.value.subnets
content {
name = subnet.value.name
address_prefix = subnet.value.address_prefixes
}
}
}
variables.tf
variable networks {
type = list(object({
name = string
address_space = list(string)
rg_name = string
location = string
subnets = list(object({
name = string
address_prefixes = string
}))
}))
}
module (main.tf)
module "azurevnet"{
source = "./vnet"
networks = var.networks
}
provider.tf
provider "azurerm" {
version = "=2.37.0"
}
据我所知,注册表 terraform-providers/azure
是一个已弃用的提供程序。这个模型不会再添加新的东西了,Azure已经变成了ARM模型。所以我建议你只使用 terraform-providers/azurerm
模型,它支持更多的 Azure 功能。
更新:
并使用 azurerm
模型,目录结构如下所示:
main.tf
module "azurevnet" {
source = "./vnet"
networks = var.networks
}
providers.tf
provider "azurerm" {
features {}
version = "=2.37.0"
}
vnet/main.tf
variable "networks" {}
resource "azurerm_virtual_network" "vnet" {
for_each = { for n in var.networks : n.name => n }
name = each.value.name
address_space = each.value.address_space
location = each.value.location
resource_group_name = each.value.rg_name
dynamic "subnet" {
for_each = each.value.subnets
content {
name = subnet.value.name
address_prefix = subnet.value.address_prefixes
}
}
}
我只给出了VNet的代码,其他资源也是一样的格式。而且你也可以不使用providers.tf文件,将内容放到main.tf文件中。
当我尝试初始化 terraform 时,我仅在使用 vnet 模块时遇到以下错误, 但是使用 azure_resource_group、azure_virtual_machine 模块
的地形初始化Terraform 0.13 及更早版本允许在 provider 配置块,但现在已弃用并将被删除 在未来版本的 Terraform 中。要消除此警告,请移动提供者 required_providers 块中的版本约束。
错误:无法查询可用的提供程序包
无法检索提供程序的可用版本列表 hashicorp/azure: 提供商注册表 registry.terraform.io 没有 提供者名为 registry.terraform.io/hashicorp/azure
如果您刚刚从 Terraform v0.12 直接升级到 Terraform v0.14 那么请先升级到 Terraform v0.13 并按照升级指南进行操作 那个版本,它可能会帮助你解决这个问题。
您打算使用 terraform-providers/azure 吗?如果是这样,您必须指定 需要该提供程序的每个模块中的源地址。看看哪个 模块目前依赖于 hashicorp/azure、
enter image description here
enter image description here
main.tf
resource "azurerm_virtual_network" "vnet" {
for_each = { for n in var.networks : n.name => n }
name = each.value.name
address_space = each.value.address_space
location = each.value.location
resource_group_name = each.value.rg_name
dynamic "subnet" {
for_each = each.value.subnets
content {
name = subnet.value.name
address_prefix = subnet.value.address_prefixes
}
}
}
variables.tf
variable networks {
type = list(object({
name = string
address_space = list(string)
rg_name = string
location = string
subnets = list(object({
name = string
address_prefixes = string
}))
}))
}
module (main.tf)
module "azurevnet"{
source = "./vnet"
networks = var.networks
}
provider.tf
provider "azurerm" {
version = "=2.37.0"
}
据我所知,注册表 terraform-providers/azure
是一个已弃用的提供程序。这个模型不会再添加新的东西了,Azure已经变成了ARM模型。所以我建议你只使用 terraform-providers/azurerm
模型,它支持更多的 Azure 功能。
更新:
并使用 azurerm
模型,目录结构如下所示:
main.tf
module "azurevnet" {
source = "./vnet"
networks = var.networks
}
providers.tf
provider "azurerm" {
features {}
version = "=2.37.0"
}
vnet/main.tf
variable "networks" {}
resource "azurerm_virtual_network" "vnet" {
for_each = { for n in var.networks : n.name => n }
name = each.value.name
address_space = each.value.address_space
location = each.value.location
resource_group_name = each.value.rg_name
dynamic "subnet" {
for_each = each.value.subnets
content {
name = subnet.value.name
address_prefix = subnet.value.address_prefixes
}
}
}
我只给出了VNet的代码,其他资源也是一样的格式。而且你也可以不使用providers.tf文件,将内容放到main.tf文件中。