如何在terraform中定义全局变量?

问题描述 投票:0回答:4

我正在开发一个 terraform 项目。在其中,我想要一个文件包含许多变量。我希望可以从项目的任何模块访问这些变量。我已经查看了文档和 Udemy 课程,但仍然不知道如何执行此操作。在 terraform 中如何做到这一点?

terraform
4个回答
16
投票

我认为这是不可能的。 Github 上有很多关于此问题的讨论,但这不是 Hashicorp 团队想要的。

总的来说,我们反对全局变量的特定解决方案,因为它使得模块的输入 -> 资源 -> 输出流程不那么明确,而明确性是一个核心设计目标。

我知道,我们必须在不同模块之间重复很多变量


14
投票

对于许多模块之间的路径常量,我们可以使用以下简单的方法。

/modules/global_constants/outputs.tf:

描述具有全局常量作为输出的模块:

output "parameter_1" {
  value     = "value_1"
  sensitive = true
}

output "parameter_2" {
  value     = "value_2"
  sensitive = true
}

/example_1.tf

之后我们就可以在任何*.tf中使用了

module "global_settings" {
   source = "./modules/global_constants"
}

data "azurerm_key_vault" "keyvault" {
   name                = module.global_settings.parameter_1
   resource_group_name = module.global_settings.parameter_2
}

/模块/module2/main.tf

或在其他任何模块中:

module "global_settings" {
   source = "../global_constants"
}

data "azurerm_key_vault" "keyvault" {
   name                = module.global_settings.parameter_1
   resource_group_name = module.global_settings.parameter_2
}

6
投票

我尝试这样做

  1. 定义一组公共变量,例如

    common_tags
    位于所有模块的
    variables.tf
    文件的底部/顶部。通常,您的技术操作管理员/云管理员将为此创建一个模板项目。

  2. 对于每个模块,我添加以下内容作为最后一项

    global_var   = var.global_var_val

一个例子是常见标签。在任何根/子模块中,我使用

merge()
函数将它们组合起来。我希望这是有道理的。


2
投票

您可以使用

-var-file
来传递覆盖。示例:

terraform -chdir=staging/000base apply -var-file ../../global.tfvars

其他方式可以是专用共享模块。 例如,您的模块具有:

output "my_var" {
  value = "apollo440"
}

在其他模块中,您可以像这样使用它:

module "gvars" {
  # source = "[email protected]:user/terraform-global-vars.git?ref=v0.0.1-alpha"
  source="../../../modules/global_vars"
}

provider "something" {
  name="${module.gvars.my_var}"
}

第三种方法可能是使用 https://registry.terraform.io/providers/hashicorp/http/latest/docs/data-sources/http 来查询一些

http
端点。

哦...第四种方法可能是利用 Vault Provider https://registry.terraform.io/providers/hashicorp/vault/latest/docs

© www.soinside.com 2019 - 2024. All rights reserved.