Terraform中能否用映射作为资源配置并合并映射?
在Terraform中合并映射配置GitHub仓库资源的可行方案
完全可行,你可以通过加载YAML配置、合并默认与自定义映射、遍历生成资源的方式实现,避免逐个手动指定配置项。以下是具体实现步骤:
1. 加载YAML配置文件
首先用yamldecode和file函数读取你的YAML配置文件,解析成Terraform可用的映射结构。假设你的YAML文件repo_config.yaml结构如下:
repo_defaults: description: "默认仓库描述" private: false auto_init: true delete_branch_on_merge: true repos: repo-1: name: "repo-1" description: "仓库1的自定义描述" repo-2: name: "repo-2" private: true
在Terraform中加载配置:
locals { repo_config = yamldecode(file("${path.module}/repo_config.yaml")) }
2. 合并默认与自定义配置
你之前的merge写法无效,大概率是没正确结合for_each遍历仓库列表。先在本地变量中预合并所有仓库的配置(自定义配置会覆盖默认值):
locals { merged_repos = { for repo_key, repo_details in local.repo_config.repos : repo_key => merge(local.repo_config.repo_defaults, repo_details) } }
3. 生成GitHub仓库资源
通过for_each遍历合并后的映射,自动创建每个仓库资源:
resource "github_repository" "all_repos" { for_each = local.merged_repos name = each.value.name description = each.value.description private = each.value.private auto_init = each.value.auto_init delete_branch_on_merge = each.value.delete_branch_on_merge }
关键注意点
- 自定义配置中的键会优先覆盖默认配置的同名键,符合预期的配置优先级
- 每个仓库的自定义配置必须包含
name字段(GitHub仓库名是必填项,默认配置里不会包含通用名称) - 如果你的YAML中
repos是列表而非映射,需要先转换成键值对结构,比如用for循环以仓库名为键生成映射
内容的提问来源于stack exchange,提问作者Reece
相关产品推荐
相关产品推荐

