提供程序变量可以在Terraform中使用吗?

时间:2019-08-15 16:23:05

标签: terraform terraform-provider-azure

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

supplier = ["azurerm.core-prod","azurerm.core-nonprod"]

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

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

provider "azurerm" {
  ...
  alias = "core-nonprod"

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

data "azurerm_public_ip" "pip" {
  count = "${var.count}"
   ....
   provider = "${var.supplier[count.index]}"
} 

什么是解决方法? 错误:提供程序配置参考无效,显示 provider参数需要提供程序类型名称,可以选择后面跟有句点,然后是配置别名

1 个答案:

答案 0 :(得分:2)

不可能将资源与提供程序动态关联。与在静态类型的编程语言中通常无法在运行时动态切换特定符号以引用其他库的方式类似,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
  }
}

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

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