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

面向多组织团队的同一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:服务主体ID
  • ARM_CLIENT_SECRET:服务主体密钥
  • ARM_TENANT_ID:Azure租户ID

关键需求匹配

  1. 单仓库集中管理:所有团队配置和共用模块都在同一个Git仓库中
  2. 独立状态文件:每个团队通过专属Azure Blob容器存储状态文件,完全隔离
  3. main分支自动部署新增配置:通过git diff识别新增团队目录,自动触发部署
  4. 不更新已有配置:仅处理新增目录,已有团队的配置需手动触发专属Job更新
  5. 新增配置无需修改CI:动态识别team-前缀的目录,新增团队文件夹后CI自动适配
  6. 无复杂Shell脚本:核心逻辑仅用git diff和简单循环,无复杂依赖

手动更新已有团队

平台团队需要更新已有团队的基础设施时,只需在GitLab CI界面手动触发deploy_existing_team Job,并在变量中指定目标团队目录(如team-a)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:32:46