我正在编写一个terraform模块,它将基于传递给它的键从映射中选择一个值。 没什么异常。
但是,该映射中的值是秘密的,并且不会根据谁在调用模块而更改。 我想保守这些秘密的一种简单方法是将变量定义为模块中variable.tf中的映射,将键/值放入模块中的terraform.tfvars中,.gitignore terraform.tfvars,并将其加密为terraform.tfvars.gpg之类的东西。
但这是行不通的,因为我在terraform模块中没有默认变量,因为我希望变量由调用者设置。 我可以在调用程序中定义不带值的变量,将其添加到调用中,然后手动指定--var-file或在调用程序中包含terraform.tfvars。但这意味着用户必须记住在使用新模块的任何地方都神奇的--var文件调用或terraform.tfvars的重复。 记住魔术字符串和复制都是不好的选择。
模块是否可以使用其自身的 tfvars来填充未传递给它的变量?
答案 0 :(得分:1)
无法将自动.tfvars
文件与非根模块一起使用。子模块始终从调用module
块获取所有值(在适当的位置插入default
值); .tfvars
仅用于为根模块变量分配值。
另一个与您描述的特征类似的选项是在模块目录中使用JSON或YAML格式的数据文件,然后使用the file
function和其中一种解码函数将其加载。例如:
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
调用将失败,并显示“找不到文件”错误消息。
答案 1 :(得分:0)
我不太确定我能理解,但会刺中。您在使用AWS吗?我过去使用的一个有趣的解决方案是SSM参数。
data "aws_ssm_parameter" "foo" {
name = "foo"
}
...
value = data.aws_ssm_parameter.foo.value
...
可以在tf之外创建SSM参数,并在您的模块中查找(以及根据访问者通过IAM或其他方式授予访问权限的策略)。