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