面向多组织团队的同一Terraform模块CI/CD部署方案咨询
解决方案
目录结构优化
基于你已有的规划,补充共用模块目录,确保所有团队复用相同基础设施组件:
. ├── modules/ │ └── common-infra/ # 所有团队共用的基础设施模块(比如VM、网络、存储等) ├── team-a/ │ ├── main.tf │ ├── providers.tf │ └── .terraform.lock.hcl ├── team-b/ │ ├── main.tf │ ├── providers.tf │ └── .terraform.lock.hcl └── .gitlab-ci.yml
Terraform配置要点
每个团队目录下的providers.tf需配置独立的Azure Blob Storage后端,确保状态文件完全隔离:
# team-a/providers.tf terraform { backend "azurerm" { resource_group_name = "tf-state-resource-group" storage_account_name = "yourtfstateaccount" container_name = "team-a-tfstate" key = "terraform.tfstate" } } provider "azurerm" { features {} subscription_id = "team-a-azure-subscription-id" }
main.tf直接引用共用模块,保持配置统一且支持团队自定义参数:
# team-a/main.tf module "common_infra" { source = "../modules/common-infra" # 团队专属参数 resource_prefix = "team-a" vm_count = 2 }
GitLab CI配置
核心逻辑是动态识别main分支新增的团队目录,仅部署这些目录的配置,无需修改CI脚本即可支持新增团队:
stages: - validate - deploy validate_terraform: stage: validate image: hashicorp/terraform:latest script: - | # 校验所有团队目录的Terraform配置格式与合法性 for DIR in team-*/; do cd $DIR terraform fmt -check terraform init -input=false terraform validate cd .. done only: - merge_requests - main deploy_new_teams: stage: deploy image: hashicorp/terraform:latest script: - | # 获取main分支上新增的一级团队目录(排除modules目录) NEW_TEAMS=$(git diff --name-only HEAD^ HEAD | grep -E '^team-' | cut -d'/' -f1 | sort -u) if [ -z "$NEW_TEAMS" ]; then echo "无新增团队目录,跳过部署" exit 0 fi # 遍历新增目录执行部署流程 for TEAM in $NEW_TEAMS; do echo "开始部署团队 $TEAM 的基础设施" cd $TEAM terraform init -input=false terraform plan -input=false -out=tfplan terraform apply -input=false tfplan cd .. done only: - main environment: name: production # 手动更新已有团队配置的专属Job deploy_existing_team: stage: deploy image: hashicorp/terraform:latest script: - | if [ -z "$TEAM_DIR" ]; then echo "请指定TEAM_DIR变量(例如:team-a)" exit 1 fi cd $TEAM_DIR terraform init -input=false terraform plan -input=false -out=tfplan terraform apply -input=false tfplan only: - main when: manual variables: TEAM_DIR: "" environment: name: production
CI认证配置
在GitLab项目的Settings > CI/CD > Variables中添加Azure服务主体的认证变量,确保CI有权限访问所有团队的订阅:
ARM_CLIENT_ID:服务主体IDARM_CLIENT_SECRET:服务主体密钥ARM_TENANT_ID:Azure租户ID
关键需求匹配
- 单仓库集中管理:所有团队配置和共用模块都在同一个Git仓库中
- 独立状态文件:每个团队通过专属Azure Blob容器存储状态文件,完全隔离
- main分支自动部署新增配置:通过
git diff识别新增团队目录,自动触发部署 - 不更新已有配置:仅处理新增目录,已有团队的配置需手动触发专属Job更新
- 新增配置无需修改CI:动态识别
team-前缀的目录,新增团队文件夹后CI自动适配 - 无复杂Shell脚本:核心逻辑仅用
git diff和简单循环,无复杂依赖
手动更新已有团队
平台团队需要更新已有团队的基础设施时,只需在GitLab CI界面手动触发deploy_existing_team Job,并在变量中指定目标团队目录(如team-a)即可。
内容的提问来源于stack exchange,提问作者philmph
相关产品推荐
相关产品推荐

