2

我正在尝试一些相当简单的事情,但似乎无法理解它。我有以下结构:

- terragrunt.hcl
-----dummy/
---------main.tf
---------terragrunt.hcl

我希望在根级别设置一些公共变量,并在 main.tf 中使用它们。我会如何在根 terragrunt 级别声明变量,并让它们在下游可用?

我已经尝试将它们设置为根中的输入,但随后必须在虚拟级别显式声明“变量”才能获取输入。我希望以某种方式在根级别定义这些东西,而不是在虚拟/级别重复变量声明。这是可行的吗?

4

3 回答 3

3

您确实可以在此处记录此操作: https ://terragrunt.gruntwork.io/docs/reference/built-in-functions/#read_terragrunt_config

您可以合并任何模块上方某个文件中定义的所有输入。

从文档:

read_terragrunt_config(config_path, [default_val]) 解析给定路径的 terragrunt 配置,并将结果序列化为可用于引用已解析配置值的映射。此函数将公开 terragrunt 配置的所有块和属性。

例如,假设您有一个名为 common.hcl 的配置文件,其中包含公共输入变量:

inputs = {
  stack_name = "staging"
  account_id = "1234567890"
}

您可以使用 read_terragrunt_config 在另一个配置中读取这些输入,并将它们合并到输入中:

locals {
  common_vars = read_terragrunt_config(find_in_parent_folders("common.hcl"))
}

inputs = merge(
  local.common_vars.inputs,
  {
    # additional inputs
  }
)

此函数还接受一个可选的第二个参数,如果文件不存在,将返回该参数:

locals {
  common_vars = read_terragrunt_config(find_in_parent_folders("i-dont-exist.hcl", "i-dont-exist.hcl"), {inputs = {}})
}

inputs = merge(
  local.common_vars.inputs, # This will be {}
  {
    # additional inputs
  }
)
于 2021-03-21T04:01:04.913 回答
2

根据 Terragrunt 文档:“目前,您只能引用在同一配置文件中定义的本地变量。Terragrunt 不会自动将包含块的父配置中定义的本地变量包含到当前上下文中。”

但是,您可以执行此操作的一种方法如下:

  1. 创建一个包含公共变量的文件(例如myvars.hcl
  2. 将其加载到子 terragrunt 中:

    locals {
      myvars = read_terragrunt_config(find_in_parent_folders("myvars.hcl"))
      foo = local.myvars.locals.foo
    }
    

希望有帮助!

于 2020-04-29T21:25:50.407 回答
0

Ansible 等其他工具具有目录层次结构,其中子级可以引用或覆盖在父级设置的变量的值。

Terraform 没有这样的机制,每个包含 tf 文件的目录都是一个单独的 Terraform 模块。因此不能使用目录层次结构来传递/继承/引用 Terraform 变量。

也许最好让“下游或上游”的想法消失。

定义公共变量并在其他模块之间共享它们的一种方法是Data-only Modules。对此进行扩展并使通用变量在全球范围内可用是使用Terraform 注册表,尽管它不是预期用途。

于 2020-04-11T10:41:42.213 回答