如何通过Terraform基于JSON文件动态生成GitHub仓库的terraform.tfvars.json?
解决Terraform动态生成GitHub仓库及对应tfvars文件的问题
核心思路
通过Terraform的fileset函数自动扫描environments目录下的所有JSON文件,基于这些文件批量创建GitHub仓库,并将对应JSON文件的原始内容写入仓库中的terraform.tfvars.json文件,实现新增JSON文件时自动触发资源创建。
完整配置示例
1. 定义本地变量,读取环境配置文件
locals { # 获取environments目录下所有.json文件的路径 env_file_paths = fileset(path.module, "environments/*.json") # 从文件路径中提取环境名(作为仓库名称) env_names = [ replace(file_path, "environments/(.*)\\.json", "$1") for file_path in local.env_file_paths ] # 构建环境配置映射:键为环境名,值为解析后的JSON内容(用于配置仓库属性) env_configs = { for name in local.env_names : name => jsondecode(file("environments/${name}.json")) } }
2. 动态创建GitHub仓库
resource "github_repository" "environment_repos" { # 遍历每个环境配置,批量生成仓库 for_each = local.env_configs name = each.key description = each.value.description != null ? each.value.description : "Environment repo for ${each.key}" private = each.value.private != null ? each.value.private : true default_branch = "main" }
3. 动态向仓库添加terraform.tfvars.json文件
resource "github_repository_file" "terraform_tfvars" { # 与仓库资源使用相同遍历键,确保一一对应 for_each = local.env_configs repository = github_repository.environment_repos[each.key].name file = "terraform.tfvars.json" # 直接读取本地JSON文件的原始内容,保证与源文件一致 content = file("environments/${each.key}.json") branch = github_repository.environment_repos[each.key].default_branch commit_message = "Add terraform.tfvars.json for ${each.key}" }
关键说明
- 自动识别新增文件:
fileset函数会实时扫描目录,当environments目录新增.json文件时,Terraform执行plan时会自动识别并创建对应的仓库和文件资源。 - 内容关联正确性:通过
each.key关联环境名与仓库名,直接读取本地JSON文件原始内容写入仓库,避免解析后再序列化导致的格式差异。 - 配置灵活性:
env_configs中解析的JSON内容可用于配置仓库的私有性、描述等属性,可根据你的JSON结构调整字段。
注意事项
- 确保GitHub Provider已配置足够权限(仓库创建、文件写入权限)。
- 若JSON文件包含敏感信息,建议通过Terraform变量或密钥管理工具处理,避免直接暴露。
内容的提问来源于stack exchange,提问作者Container-Man
相关产品推荐
相关产品推荐

