You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terragrunt:从下级目录文件获取变量并实现输入值验证

Terragrunt实现app_name变量的动态验证(基于下级subenv.hcl的App_tag值)

现有目录结构

project
  environment-dev
    _common
      region
        apps
          app-a
            subenv.hcl
          app-b
            subenv.hcl
          app-c
            subenv.hcl
          ... # 未来可添加其他应用
          app-x
            subenv.hcl
    account.hcl

subenv.hcl配置片段

每个subenv.hcl文件包含以下配置:

# tags
  app_tags = {
    "App_tag" = "app-x"
  }

需求

在account.hcl中定义手动输入的本地变量app_name,并添加输入验证,仅允许输入的值为下级所有subenv.hcl文件中App_tag的取值。

遇到的问题

尝试使用带find_in_parent_folders参数的read_terragrunt_config函数,但该参数仅支持向上搜索目录树,无法读取下级目录的目标文件变量值,需要可行方案。


解决方案:借助外部脚本动态收集合法值

Terragrunt本身没有内置的下级目录遍历函数,因此可以通过调用外部脚本提取所有App_tag的值,再在Terragrunt中完成验证逻辑。

步骤1:编写Shell脚本收集合法值

在environment-dev目录下创建get_valid_apps.sh脚本:

#!/bin/bash
# 遍历所有subenv.hcl文件,提取App_tag字段的值
find _common/region/apps -name "subenv.hcl" -exec grep -oP 'App_tag" = "\K[^"]+' {} \; | sort | uniq

执行以下命令赋予脚本执行权限:

chmod +x get_valid_apps.sh

步骤2:在account.hcl中配置变量与验证

在account.hcl中调用脚本获取合法值,并为app_name变量添加验证规则:

locals {
  # 调用脚本获取所有合法的App_tag值,处理换行符得到数组
  valid_app_names = split("\n", trim(run_cmd("./get_valid_apps.sh"), "\n"))
}

variable "app_name" {
  description = "指定要操作的应用名称,必须为已定义的应用"
  type        = string

  validation {
    condition     = contains(local.valid_app_names, var.app_name)
    error_message = "输入的app_name无效,合法值为:${join(", ", local.valid_app_names)}。"
  }
}

补充说明

  • 脚本会自动遍历_common/region/apps下所有子目录的subenv.hcl文件,即使未来新增应用,只要保持相同的目录结构和配置格式,无需修改脚本或Terragrunt配置。
  • 若使用Windows环境,可将脚本替换为PowerShell版本,核心逻辑为遍历目标文件、提取App_tag的值。
  • 确保Terragrunt拥有脚本的执行权限,且脚本路径与account.hcl的相对位置正确(若不在同一目录,需调整脚本路径)。

内容的提问来源于stack exchange,提问作者YAZ84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:00:05