0

我们可以在 terragrunt 配置中使用 terraform 变量吗?

下面是我的 terragrunt 配置。

#terragrunt.hcl

remote_state {
  backend = "s3"
  generate = {
    path      = "remote_state.tf"
    if_exists = "overwrite_terragrunt"
  }
  # Terragrunt built-in function:
  # sets key relative to the modules
  config = {
    bucket         = ${var.bucket_name}
    key            = ${var.key}
    encrypt        = true
  }
}

在 root.yaml 文件中,我传递了变量 bucket_name 和 key 的输入值。这些变量在 terraform 模块中定义。

#root.yaml
bucket_name: "s3-bucket"
key:    "foo"

这不起作用,terragrunt 抱怨未定义变量。如果不创建用于 terragrunt 的新变量,我们不能在 terragrunt 配置中使用 terraform 变量吗?

4

4 回答 4

1

Terragrunt 在 hcl 级别上没有变量,但它允许您使用可以从文件中读取的本地变量:

#terragrunt.hcl
locals {
  config_vars    = read_terragrunt_config("config.hcl")
}

remote_state {
  backend = "s3"
  generate = {
    path      = "remote_state.tf"
    if_exists = "overwrite_terragrunt"
  }
  # Terragrunt built-in function:
  # sets key relative to the modules
  config = {
    bucket         = "${local.config_vars.locals.bucket_name}"
    key            = "${local.config_vars.locals.key}"
    encrypt        = true
  }
}
# config.hcl:
locals {
    bucket_name = "s3-bucket"
    key         = "foo"
}
于 2021-03-03T15:14:04.507 回答
0

如果你想继续使用 yaml 作为你的配置源,你可以在本地解码它

locals {
 vars        = yamldecode(file(("root.yaml"))
 bucket_name = local.vars.bucket_name
}
于 2021-12-30T15:29:59.867 回答
0

我实际上已经玩了几个小时并意识到了一些事情。

方法一:从操作系统环境中读取变量

如果您要将文件作为系统级环境变量(您在 Debian 或 RedHat Linux 中定义的变量)读取文件,则文档建议如下:

https://terragrunt.gruntwork.io/docs/reference/built-in-functions/#get_env

请注意,Terraform 将读取以前缀 TF_VAR_ 开头的环境变量,因此在 Terraform 和 Terragrunt 之间共享名为 foo 的变量的一种方法是将其值设置为环境变量 TF_VAR_foo 并使用此 get_env() 内置读取该值在功能上。

这意味着您可以TF_VAR_foo在操作系统级别进行设置,并且可以使用它get_env()。我打开 ~/.bash_profile 并添加export TF_VAR_env=sandbox并运行source ~/.bash_profile,但它没有用。然后我尝试export env=sandbox了 ~/.bash_profile 并且确实适用于get_env("env", "").

方法2:从文件中读取变量

Terragrunt 有一个file()内置函数。您可以使用它来读取存储在 yml 文件中的变量:

locals {
  settings_default    = yamldecode(file("defaults.yml"))
} 

在 defaults.yml 中,您可以拥有键/值对:

---
some_var: some_val
于 2022-02-12T10:19:16.857 回答
0

您可以使用 env 声明 terraform var:

export TF_VAR_bucket_name=mybucket

和 terragrunt 配置:

config = {
  bucket = get_env("TF_VAR_bucket_name", "otherbucket")
}
于 2021-04-16T16:16:19.700 回答