如何配置azure-pipeline.yaml实现多子文件夹Terraform资源自动部署
Terraform流水线触发与部署修复方案
项目结构
Azure_Architecture/ ├── module/ └── subscription/ ├── eu-north/ │ └── platform/ │ ├── resource_group/ │ │ ├── provider.tf │ │ ├── main.tf │ │ ├── variable.tf │ │ └── terraform.tfvars │ ├── vnets/ │ │ └── [同resource_group下的四个文件] │ └── subnet/ │ └── [同resource_group下的四个文件] └── eu-west/
需求
当任意资源子文件夹(如resource_group、vnets等)中的terraform.tfvars文件被修改时,自动触发流水线完成对应资源的部署。
原脚本问题分析
你提供的流水线脚本无法正常工作,核心问题包括:
- 触发规则未限定目标文件,导致任意代码变更都会触发流水线
- 禁用了自动checkout,后续无法正常访问仓库文件
- Terraform操作未定位到正确的资源文件夹
- 多个步骤为空,无实际执行逻辑
修正后的完整流水线代码
trigger: branches: include: - main paths: include: - 'Azure_Architecture/subscription/*/platform/**/terraform.tfvars' pool: vmImage: 'ubuntu-latest' steps: - checkout: self fetchDepth: 2 # 拉取最近两次提交,用于对比文件变更 - script: | # 获取本次提交相对于上一次的变更tfvars文件 changed_files=$(git diff --name-only HEAD~1 HEAD | grep "terraform.tfvars") echo "检测到变更的tfvars文件:$changed_files" # 遍历每个变更文件,执行对应资源的Terraform操作 for file in $changed_files; do # 获取资源文件夹路径 resource_folder=$(dirname "$file") echo "进入资源目录:$(System.DefaultWorkingDirectory)/$resource_folder" cd "$(System.DefaultWorkingDirectory)/$resource_folder" # 初始化Terraform terraform init -input=false # 验证配置文件 terraform validate # 生成部署计划并保存 terraform plan -var-file=terraform.tfvars -out=tfplan # 执行部署计划 terraform apply -input=false tfplan # 返回根目录,处理下一个变更文件 cd "$(System.DefaultWorkingDirectory)" done displayName: '批量处理变更的Terraform资源'
关键修改说明
- 精准触发:通过
paths.include指定只有terraform.tfvars文件变更时才触发流水线,避免无效运行 - 代码拉取优化:启用自动checkout并设置
fetchDepth:2,仅拉取必要的提交记录,提升效率 - 批量处理逻辑:自动检测所有变更的
tfvars文件,逐个进入对应资源目录执行完整的Terraflow生命周期操作 - 无交互执行:添加
-input=false参数,确保流水线全程自动运行,无需人工干预 - 计划一致性:用
-out=tfplan保存部署计划,保证apply的内容与plan完全一致,避免部署偏差
内容的提问来源于stack exchange,提问作者rravinda
相关产品推荐
相关产品推荐

