我有一个
locals.tf
,其中包含一堆查找映射,这些映射将 tf 变量转换为已知/预期值,并返回未知值的值(可能带有后缀),例如:
locals {
Environment = lookup({
prd = "Production"
stg = "Staging"
qa = "QA"
}, var.env, var.env)
subdomain = lookup({
prd = "www"
stg = "stage"
qa = "test"
}, var.env, "${var.env}.dev")
}
我已在每个模块中复制了此文件,因此我只需将
env
var 作为输入传递给模块,而不是传递所有其他计算值。
我想消除这种重复,将所有这些信息和行为保留在一个地方,这样我只需在一处更新它,但仍然可以让所有模块访问它。不幸的是,查找的动态性质以及默认值和后缀意味着直接查找类似
jsondecode(file("foo.json"))
的内容并不是一个足够的替代方案。还有哪些其他选择?
每个模块都可以包含指向
locals.tf
文件的单个规范实例的符号链接,例如:
/main.tf
/locals.tf (the real file)
/submodule1/main.tf
/submodule1/locals.tf -> ../locals.tf
/submodule2/main.tf
/submodule1/locals.tf -> ../locals.tf
这将彻底删除文件的重复数据。然而,如果在没有清理符号链接的情况下删除原始文件,它会留下悬空引用,并且在许多编辑器中,打开符号链接之一时,正在编辑不同位置的文件并不明显。与纯粹基于 HCL 的解决方案相比,该解决方案需要更多的操作系统/操作知识。