Terraform 显式传递多个提供者
Terraform explicitly pass multiple provider
我使用 terraform 来满足所有基础设施需求。
我的所有配置都存储在 Azure KV 中,例如订阅“DEVOPS”。我所有用于测试的基础设施都是在订阅“Staging”中创建的
以下是我的TF代码
variable name {}
variable location {}
variable tags {}
provider "azurerm" {
subscription_id = "Staging"
features()
}
provider "azurerm" {
subscription_id = "DEVOPS"
features()
alias = "devopskv"
}
module "resource_group" {
source = "../modules/azure-resource-group"
name = var.name
location = var.location
tags = var.tags
providers = {
azurerm = azurerm
azurerm.devopskv = azurerm.devopskv
}
}
## Module
data "azurerm_key_vault" "kv" {
name = "my-kv"
resource_group_name = "my-kv-rg"
provider = azurerm.devopskv
}
data "azurerm_key_vault_secret" "name" {
name = var.name
key_vault_id = data.azurerm_key_vault.kv.id
provider = azurerm.devopskv
}
resource "azurerm_resource_group" "resource_group" {
name = data.azurerm_key_vault_secret.name.value
location = var.location
tags = var.tags
}
预期输出:
RG 在 Staging 订阅 Staging 中创建,名称从驻留在 DEVOPS 订阅中的 KV 中获取。
实际输出:
错误:
未找到资源组“my-kv-rg”。
跟踪详细信息:
TF 正在尝试从订阅“Staging”而非“DEVOPS”中获取 KV“my-kv”。
上面有什么问题吗?
要在模块中使用多个提供程序,我建议您在模块中也设置所有提供程序。看看link。应该是这样的:
## Module
provider "azurerm" {}
provider "azurerm" {
alias = "devopskv"
}
data "azurerm_key_vault" "kv" {
name = "my-kv"
resource_group_name = "my-kv-rg"
provider = azurerm.devopskv
}
data "azurerm_key_vault_secret" "name" {
name = var.name
key_vault_id = data.azurerm_key_vault.kv.id
provider = azurerm.devopskv
}
resource "azurerm_resource_group" "resource_group" {
name = data.azurerm_key_vault_secret.name.value
location = var.location
tags = var.tags
}
另外,你还需要设置模块内部的变量来接受根级的输入。如果您已经这样做了,请忽略此建议。
我使用 terraform 来满足所有基础设施需求。
我的所有配置都存储在 Azure KV 中,例如订阅“DEVOPS”。我所有用于测试的基础设施都是在订阅“Staging”中创建的
以下是我的TF代码
variable name {}
variable location {}
variable tags {}
provider "azurerm" {
subscription_id = "Staging"
features()
}
provider "azurerm" {
subscription_id = "DEVOPS"
features()
alias = "devopskv"
}
module "resource_group" {
source = "../modules/azure-resource-group"
name = var.name
location = var.location
tags = var.tags
providers = {
azurerm = azurerm
azurerm.devopskv = azurerm.devopskv
}
}
## Module
data "azurerm_key_vault" "kv" {
name = "my-kv"
resource_group_name = "my-kv-rg"
provider = azurerm.devopskv
}
data "azurerm_key_vault_secret" "name" {
name = var.name
key_vault_id = data.azurerm_key_vault.kv.id
provider = azurerm.devopskv
}
resource "azurerm_resource_group" "resource_group" {
name = data.azurerm_key_vault_secret.name.value
location = var.location
tags = var.tags
}
预期输出: RG 在 Staging 订阅 Staging 中创建,名称从驻留在 DEVOPS 订阅中的 KV 中获取。
实际输出: 错误: 未找到资源组“my-kv-rg”。
跟踪详细信息: TF 正在尝试从订阅“Staging”而非“DEVOPS”中获取 KV“my-kv”。
上面有什么问题吗?
要在模块中使用多个提供程序,我建议您在模块中也设置所有提供程序。看看link。应该是这样的:
## Module
provider "azurerm" {}
provider "azurerm" {
alias = "devopskv"
}
data "azurerm_key_vault" "kv" {
name = "my-kv"
resource_group_name = "my-kv-rg"
provider = azurerm.devopskv
}
data "azurerm_key_vault_secret" "name" {
name = var.name
key_vault_id = data.azurerm_key_vault.kv.id
provider = azurerm.devopskv
}
resource "azurerm_resource_group" "resource_group" {
name = data.azurerm_key_vault_secret.name.value
location = var.location
tags = var.tags
}
另外,你还需要设置模块内部的变量来接受根级的输入。如果您已经这样做了,请忽略此建议。