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
相关产品推荐
相关产品推荐

