Terraform多分支与CircleCI配置:不使用工作区实现方案咨询
无需Terraform Workspaces,用分支+CircleCI实现多环境管理
完全可以做到。核心思路是用分支对应环境,通过CircleCI针对不同分支执行独立的Terraform流程,同时用独立的状态文件和变量文件实现环境隔离,完全绕开Terraform Workspaces。
1. 分支策略
给每个环境分配专属分支:
main:生产环境staging:预发布环境feature/xxx:临时测试分支(比如新功能验证)
每个分支共享核心Terraform代码,通过不同的配置文件区分环境。
2. CircleCI 流水线配置
创建.circleci/config.yml,针对不同分支触发对应的Terraform操作(init/plan/apply),示例如下:
version: 2.1 jobs: terraform-init-plan: docker: - image: hashicorp/terraform:latest steps: - checkout - run: name: 初始化Terraform(指定分支专属后端配置) command: terraform init -backend-config="backend-${CIRCLE_BRANCH}.tfvars" - run: name: 生成执行计划(加载分支专属变量) command: terraform plan -var-file="vars-${CIRCLE_BRANCH}.tfvars" terraform-apply: docker: - image: hashicorp/terraform:latest steps: - checkout - run: name: 初始化Terraform command: terraform init -backend-config="backend-${CIRCLE_BRANCH}.tfvars" - run: name: 执行资源部署 command: terraform apply -auto-approve -var-file="vars-${CIRCLE_BRANCH}.tfvars" workflows: plan-and-deploy: jobs: - terraform-init-plan: filters: branches: only: [main, staging, feature/*] - terraform-apply: requires: [terraform-init-plan] filters: branches: only: [main, staging] # 生产/预发自动执行apply,测试分支可手动触发
3. 状态文件隔离(核心)
不用Workspaces,而是给每个分支配置独立的状态存储路径。以S3后端为例,创建分支专属的后端配置文件:
backend-main.tfvars(生产环境):
bucket = "my-terraform-state-bucket" key = "terraform/state/main/terraform.tfstate" region = "us-east-1"
backend-staging.tfvars(预发布环境):
bucket = "my-terraform-state-bucket" key = "terraform/state/staging/terraform.tfstate" region = "us-east-1"
这样每个分支的状态完全独立,不会出现环境资源互相覆盖的问题。
4. 环境变量区分
创建分支专属的变量文件,定义不同环境的参数:
vars-main.tfvars:
instance_type = "t3.large" instance_count = 3 domain_name = "prod.example.com"
vars-staging.tfvars:
instance_type = "t3.medium" instance_count = 2 domain_name = "staging.example.com"
5. 关键注意事项
- 权限管控:限制
main分支的合并权限,只有授权人员能操作生产环境; - 敏感信息:AWS密钥、API令牌等敏感数据存在CircleCI项目的环境变量中,不要硬编码到配置文件;
- 分支清理:测试分支合并后,记得手动执行
terraform destroy清理资源,并删除对应的状态文件,避免资源浪费。
内容的提问来源于stack exchange,提问作者wallace84
相关产品推荐
相关产品推荐

