Terraform 0.13-模块,每个模块和供应商

Terraform 0.13-模块,每个模块和供应商,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,已更新 我正在尝试使用Terraform在Azure中提供多个SQL数据库 My child模块具有以下代码,用于提供SQL数据库: 提供者。tf // default provider provider "azurerm" { alias = "main" features {} } // The provider that can access the storage account to store diagnostics provider

已更新

我正在尝试使用Terraform在Azure中提供多个SQL数据库

My child模块具有以下代码,用于提供SQL数据库:

提供者。tf

// default provider
provider "azurerm" {
  alias = "main"
  features {}
}

// The provider that can access the storage account to store diagnostics
provider "azurerm" {
  alias = "storage_account"
  features {}
}
resource "azurerm_mssql_database" "default" {
  name      = var.name
  base_name = var.base_name
  ...
  tags      = var.tags
  
  provider = azurerm.main
}
data "azurerm_storage_account" "storage" {
  name = var.storage_account_name
  resource_group_name = var.storage_account_rg
  provider = azurerm.storage_account
}
sql_db.tf

// default provider
provider "azurerm" {
  alias = "main"
  features {}
}

// The provider that can access the storage account to store diagnostics
provider "azurerm" {
  alias = "storage_account"
  features {}
}
resource "azurerm_mssql_database" "default" {
  name      = var.name
  base_name = var.base_name
  ...
  tags      = var.tags
  
  provider = azurerm.main
}
data "azurerm_storage_account" "storage" {
  name = var.storage_account_name
  resource_group_name = var.storage_account_rg
  provider = azurerm.storage_account
}
data.tf

// default provider
provider "azurerm" {
  alias = "main"
  features {}
}

// The provider that can access the storage account to store diagnostics
provider "azurerm" {
  alias = "storage_account"
  features {}
}
resource "azurerm_mssql_database" "default" {
  name      = var.name
  base_name = var.base_name
  ...
  tags      = var.tags
  
  provider = azurerm.main
}
data "azurerm_storage_account" "storage" {
  name = var.storage_account_name
  resource_group_name = var.storage_account_rg
  provider = azurerm.storage_account
}
我在我的main.tf文件中调用此模块,如下所示,其中我希望使用
为每个
配置多个SQL数据库:

module "sql_db" {
  for_each = var.sql_db

  source = "...../sql_db.git"

  base_name = each.value.base_name
  name      = each.value.name

  providers = {
    azurerm.main = azurerm.main
    azurerm.storage_account = azurerm.storage_account
  }
}

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

// default provider
provider "azurerm" {
  alias = "main"
  features {}
}

provider "azurerm" {
  alias = "storage_account"
  features {}
}
运行“计划”时,出现以下错误:

错误:模块不支持每个
在main.tf第35行的模块“sql_db”中:
35:for_each=var.sql_db
模块“sql\u db”不能与for\u each一起使用,因为它包含嵌套的
“azurerm.main”的提供程序配置,位于
.terraform\modules\sql\u db\providers.tf:2,10-19。
通过将此模块更改为接收所有,可以使其与for_兼容
通过使用
调用模块块中的“providers”参数。
错误:模块不支持每个
在main.tf第35行的模块“sql_db”中:
35:for_each=var.sql_db
模块“sql\u db”不能与for\u each一起使用,因为它包含嵌套的
“azurerm.storage_帐户”的提供程序配置,位于
.terraform\modules\sql\u db\providers.tf:8,10-19。
通过将此模块更改为接收所有,可以使其与for_兼容
通过使用
调用模块块中的“providers”参数。

var.sql\u db的结构是什么?您在模块中定义了两个提供程序,但只从根模块传入其中一个模块。错误抱怨它没有从调用模块接收所有提供程序配置。还有什么东西阻止您传入存储帐户提供程序吗?我会从
资源“azurerm\u mssql\u数据库”的默认值中删除
provider=azurerm.main
,并设置为
module.sql\u db.providers
=
{azurerm=azurerm.main}
。除非您出于不同的原因将其他提供者传递给同一模块。我已更新了问题的更多细节。实际上,我在子模块中使用了多个azurerm提供程序。