模块中 tfvar 的映射

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

我正在编写一个 terraform 模块,它将根据传递给它的键从地图中选择一个值。 没有什么异常。

但是,该映射中的值是秘密的,并且不会根据调用模块的人而改变。 我认为保守这些秘密的一个简单方法是将变量定义为模块中的variables.tf中的映射,将键/值放入模块中的terraform.tfvars中,.gitignore terraform.tfvars,并将其加密terraform.tfvars.gpg 或其他东西。

但这不起作用,因为我在模块 terraform 中没有默认变量,期望该变量由调用者设置。 我可以在调用方中定义不带值的变量,将其添加到调用中,然后手动指定 --var-file 或在调用方中包含 terraform.tfvars。但这意味着用户必须记住一个神奇的 --var-file 调用或在使用我的新模块的任何地方重复 terraform.tfvars 。 记住魔术字符串和重复都不是好的选择。

模块是否可以使用自己的 tfvars 来填充未传递给它的变量?

terraform
2个回答
2
投票

无法将自动

.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
调用将失败,并显示“文件未找到”错误消息。


0
投票

我不完全确定我理解,但尝试一下。您在使用 AWS 吗?我过去使用过的一个有趣的解决方案是 SSM 参数。

data "aws_ssm_parameter" "foo" {
  name  = "foo"
}

...
  value = data.aws_ssm_parameter.foo.value
...

SSM 参数可以在 tf 外部创建并在模块中查找(以及根据调用者通过 IAM 或其他方式授予访问权限的策略)。

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