【问题标题】:Is provider variable possible in terraform?提供者变量是否可以在 terraform 中使用?
【发布时间】:2019-12-22 02:01:56
【问题描述】:

在 Terraform v0.12.6 中仍然不能使用变量提供者吗?在 *.tfvars 我有列表变量 supplier

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

以及在 provider.tf 中定义的提供者:

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

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

然后我想在 *.tf 中引用它。下面的例子是'data',但同样适用于'resource'

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

什么是解决方法? 错误:无效的提供程序配置参考,表明 提供程序参数需要提供程序类型名称,可选地后跟一个句点,然后是配置别名。

【问题讨论】:

  • 您需要为此设置一个提供者别名。文档在这里:terraform.io/docs/configuration/…。 Stack Overflow 上也有关于如何使用这些的答案,您可以参考。至少从 0.11 开始,这也是可能的。
  • 对不起,我用 provider.tf 更新了我的问题,当然我已经设置好了

标签: terraform terraform-provider-azure


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的帖子。在上述场景中,如果我们在模块“providers”块中放置 4 个别名提供程序(所有 aws,每个 us 区域 1 个),子模块将如何使用它们?是否可以将它们传递给一个区域,然后使用插值从列表中选择正确的提供者?
猜你喜欢
  • 2021-09-04
  • 1970-01-01
  • 2016-11-28
  • 2018-11-22
  • 2020-08-15
  • 2021-09-04
  • 2021-03-08
  • 2019-07-30
  • 2018-10-03
相关资源
最近更新 更多