提供者变量是否可以在 terraform 中使用?

iro*_*rom 4 terraform terraform-provider-azure

仍然无法在 Terraform v0.12.6 中使用变量提供程序吗?在 *.tfvars 中,我列出了变量 供应商

supplier = ["azurerm.core-prod","azurerm.core-nonprod"]
Run Code Online (Sandbox Code Playgroud)

和 provider.tf 中定义的提供者:

provider "azurerm" {
  ...
  alias           = "core-prod"
}

provider "azurerm" {
  ...
  alias = "core-nonprod"
Run Code Online (Sandbox Code Playgroud)

然后我想在 *.tf 中引用它。下面的例子是“数据”,但同样适用于“资源”

data "azurerm_public_ip" "pip" {
  count = "${var.count}"
   ....
   provider = "${var.supplier[count.index]}"
} 
Run Code Online (Sandbox Code Playgroud)

什么是解决方法?错误:无效的提供者配置引用,显示提供者参数需要提供者类型名称,可选后跟一个句点,然后是配置别名

Mar*_*ins 6

不可能将资源与提供者动态关联。类似于在静态类型的编程语言中,您通常无法在运行时动态切换特定符号以引用不同的库,Terraform 需要在表达式评估之前将资源块绑定到提供程序配置。

可以做的是编写一个模块,该模块期望从其调用方接收提供者配置,然后静态选择该模块的每个实例的提供者配置:

provider "azurerm" {
  # ...

  alias = "core-prod"
}

module "provider-agnostic-example" {
  source = "./modules/provider-agnostic-example"

  providers = {
    # This means that the default configuration for "azurerm" in the
    # child module is the same as the "core-prod" alias configuration
    # in this parent module.
    azurerm = azurerm.core-prod
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,模块本身与提供者无关,因此它可以在您的生产和非生产设置中使用,但是模块的任何特定用途都必须指定它的用途。

一种常见的方法是为每个环境进行单独的配置,共享模块表示环境具有的任何共同特征,但提供了表示它们之间可能需要存在的任何差异的机会。在最简单的情况下,这可能只是两个配置,仅由一个module块和一个provider块组成,每个块都有一些不同的参数代表该环境的配置,并且共享模块包含所有resourcedata块。在更复杂的系统中,可能有多个模块使用模块组合技术集成在一起。

  • 这是令人悲伤的,但也是可以理解的。 (2认同)