【问题标题】:Terraform. Map in tfvars in a module地形。在模块中的 tfvars 中映射
【发布时间】:2020-08-04 13:35:48
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: terraform


    【解决方案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"))
    }
    

    如果调用者在使用模块之前忽略解密到.gitignored 文件,则file 调用将失败并显示“找不到文件”错误消息。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-01-21
        • 2020-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多