【问题标题】:use variable in terragrunt config在 terragrunt 配置中使用变量
【发布时间】:2021-06-01 15:07:30
【问题描述】:

我们可以在 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 变量吗?

【问题讨论】:

    标签: amazon-web-services terraform terragrunt terraform-aws-modules


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

    【讨论】:

      【解决方案2】:

      您可以使用 env 声明 terraform var:

      export TF_VAR_bucket_name=mybucket
      

      还有 terragrunt 配置:

      config = {
        bucket = get_env("TF_VAR_bucket_name", "otherbucket")
      }
      

      【讨论】:

        【解决方案3】:

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

        locals {
         vars        = yamldecode(file(("root.yaml"))
         bucket_name = local.vars.bucket_name
        }
        

        【讨论】:

          【解决方案4】:

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

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

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

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

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

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

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

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

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

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

          ---
          some_var: some_val
          

          【讨论】:

            猜你喜欢
            • 2021-05-16
            • 2021-05-01
            • 2021-12-16
            • 2020-07-23
            • 2021-07-02
            • 2020-07-10
            • 1970-01-01
            • 2020-07-02
            • 1970-01-01
            相关资源
            最近更新 更多