Terragrunt 和公共变量

ash*_*hic 6 terraform terragrunt

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

- terragrunt.hcl
-----dummy/
---------main.tf
---------terragrunt.hcl
Run Code Online (Sandbox Code Playgroud)

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

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

ope*_*ion 5

您确实可以在此处记录此操作: 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"
}
Run Code Online (Sandbox Code Playgroud)

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

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

inputs = merge(
  local.common_vars.inputs,
  {
    # additional inputs
  }
)
Run Code Online (Sandbox Code Playgroud)

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

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
  }
)
Run Code Online (Sandbox Code Playgroud)


mon*_*mon 0

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

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

也许最好放弃“下游或上游”的想法。

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