использовать переменную в конфигурации terragrunt

можем ли мы использовать переменные terraform внутри конфигурации terragrunt?

ниже моя конфигурация 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, нельзя ли использовать переменную terraform внутри конфигурации terragrunt?

4 ответа

Вы можете объявить вары terraform, используя env:

      export TF_VAR_bucket_name=mybucket

И конфиг террагрунта:

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

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"
}

Если вы хотите продолжать использовать yaml в качестве источника для своих конфигураций, вы можете декодировать его в локальных файлах.

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

Я на самом деле играл с этим в течение нескольких часов и понял несколько вещей.

Подход 1: Чтение переменных из среды ОС

если вы собираетесь читать файл как переменную среды системного уровня (переменную, которую вы определили, скажем, в 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но это не сработало. затем я попытался export env=sandboxв ~/.bash_profile, и это действительно сработало get_env("env", "").

Подход 2: Чтение переменных из файла

У Террагрунт есть file()встроенная функция. Вы можете использовать его для чтения переменных, хранящихся в файле yml:

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

Внутри defaults.yml вы можете иметь пары ключ/значение:

      ---
some_var: some_val
Другие вопросы по тегам