Terraform azure 不兼容的提供程序版本

Posted

技术标签:

【中文标题】Terraform azure 不兼容的提供程序版本【英文标题】:Terraform azure Incompatible provider version 【发布时间】:2021-03-29 19:36:08 【问题描述】:

当我尝试初始化 terraform 时,我只会在使用 vnet 模块时遇到以下错误, 但是 terraform 初始化与 azure_resource_group、azure_virtual_machine 模块一起使用

Terraform 0.13 及更早版本允许在 provider 配置块,但现在已弃用并将被删除 在未来版本的 Terraform 中。要使此警告静音,请移动提供程序 版本约束到 required_providers 块中。

错误:无法查询可用的提供程序包

无法检索提供程序的可用版本列表 hashcorp/azure:提供者注册表 registry.terraform.io 没有 名为 registry.terraform.io/hashicorp/azure 的提供程序

如果您刚刚从 Terraform v0.12 直接升级到 Terraform v0.14 那么请先升级到 Terraform v0.13 并按照升级指南 该版本可能会帮助您解决此问题。

您是否打算使用 terraform-providers/azure?如果是这样,您必须指定 需要该提供程序的每个模块中的源地址。看看哪个 模块目前依赖于 hashcorp/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"

【问题讨论】:

【参考方案1】:

据我所知,注册表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文件中。

【讨论】:

能否提供代码 sn-p 以供使用 "terraform-providers/azurerm"。在哪里放置这个提供者?如何避免使用 terraform-providers/azurerm 我已经在 provider.tf 中提到了 azurerm 的版本。如果你看到我的代码。 @BasavarajBiradar 我以 VNet 为例。

以上是关于Terraform azure 不兼容的提供程序版本的主要内容,如果未能解决你的问题,请参考以下文章

Terraform:无法删除已弃用的 hashcorp/azure 提供程序

使用 Azure 提供程序的 Terraform “AuthorizationFailed”

Terraform - 部署到多个 Azure 订阅

Azure API 无法识别来自 Terraform 的服务主体

通过 Terraform Helm 提供程序和 Azure DevOps 部署 helm 图表,同时从 ACR 获取 helm 图表

在 Terraform 中将 SSL 证书附加到 Azure 应用程序网关