我正在开发一个 terraform 项目。在其中,我想要一个文件包含许多变量。我希望可以从项目的任何模块访问这些变量。我已经查看了文档和 Udemy 课程,但仍然不知道如何执行此操作。在 terraform 中如何做到这一点?
我认为这是不可能的。 Github 上有很多关于此问题的讨论,但这不是 Hashicorp 团队想要的。
总的来说,我们反对全局变量的特定解决方案,因为它使得模块的输入 -> 资源 -> 输出流程不那么明确,而明确性是一个核心设计目标。
我知道,我们必须在不同模块之间重复很多变量
对于许多模块之间的路径常量,我们可以使用以下简单的方法。
描述具有全局常量作为输出的模块:
output "parameter_1" {
value = "value_1"
sensitive = true
}
output "parameter_2" {
value = "value_2"
sensitive = true
}
之后我们就可以在任何*.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
}
或在其他任何模块中:
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
}
我尝试这样做
定义一组公共变量,例如
common_tags
位于所有模块的 variables.tf
文件的底部/顶部。通常,您的技术操作管理员/云管理员将为此创建一个模板项目。
对于每个模块,我添加以下内容作为最后一项
global_var = var.global_var_val
一个例子是常见标签。在任何根/子模块中,我使用
merge()
函数将它们组合起来。我希望这是有道理的。
您可以使用
-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