我正在编写一个 terraform 模块,它将根据传递给它的键从地图中选择一个值。 没有什么异常。
但是,该映射中的值是秘密的,并且不会根据调用模块的人而改变。 我认为保守这些秘密的一个简单方法是将变量定义为模块中的variables.tf中的映射,将键/值放入模块中的terraform.tfvars中,.gitignore terraform.tfvars,并将其加密terraform.tfvars.gpg 或其他东西。
但这不起作用,因为我在模块 terraform 中没有默认变量,期望该变量由调用者设置。 我可以在调用方中定义不带值的变量,将其添加到调用中,然后手动指定 --var-file 或在调用方中包含 terraform.tfvars。但这意味着用户必须记住一个神奇的 --var-file 调用或在使用我的新模块的任何地方重复 terraform.tfvars 。 记住魔术字符串和重复都不是好的选择。
模块是否可以使用自己的 tfvars 来填充未传递给它的变量?
无法将自动
.tfvars
文件与非根模块一起使用。子模块始终从调用 module
块获取所有值(在适当的位置插入 default
值); .tfvars
仅用于为根模块变量赋值。
与您所描述的特征相似的另一个选项是在模块目录中使用 JSON 或 YAML 格式的数据文件,并使用
file
函数 和其中一个解码函数加载它。例如:
locals {
# This file must be created before using this module by
# decrypting secrets.yaml.gpg in this directory.
secrets = yamldecode(file("${path.module}/secrets.yaml"))
}
如果调用者在使用模块之前忽略解密到
.gitignore
d 文件,则 file
调用将失败,并显示“文件未找到”错误消息。
我不完全确定我理解,但尝试一下。您在使用 AWS 吗?我过去使用过的一个有趣的解决方案是 SSM 参数。
data "aws_ssm_parameter" "foo" {
name = "foo"
}
...
value = data.aws_ssm_parameter.foo.value
...
SSM 参数可以在 tf 外部创建并在模块中查找(以及根据调用者通过 IAM 或其他方式授予访问权限的策略)。