为每个Terraform状态文件配置独立Github Actions工作流咨询
最优实现方案:基于目录触发的独立Terraform工作流
核心思路是在根目录的.github/workflows下为每个Terraform模块创建独立的工作流文件,通过GitHub Actions的paths触发器精准控制仅对应目录变更时触发,同时指定working-directory指向模块目录。
具体步骤
1. 为每个模块创建独立工作流文件
在仓库根目录的.github/workflows下,给每个Terraform模块创建单独的工作流文件,比如:
- 对应
global/Route53模块:terraform-route53.yml - 对应
global/IAM模块:terraform-iam.yml
这样每个工作流职责明确,便于维护。
2. 配置精准触发条件
在每个工作流文件的on字段中,通过paths限定仅当对应模块目录下的文件变更时触发工作流。示例(以Route53模块为例):
on: push: paths: - 'global/Route53/**' pull_request: paths: - 'global/Route53/**'
**通配符表示匹配目录下所有文件及子目录,确保模块内任何变更都会触发对应的工作流,其他目录的变更不会干扰。
3. 指定工作目录执行Terraform命令
在工作流的jobs中,通过defaults.run.working-directory指定模块所在目录,后续所有Terraform命令都会在该目录下执行。示例:
jobs: terraform: runs-on: ubuntu-latest defaults: run: working-directory: global/Route53 steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Terraform uses: hashicorp/setup-terraform@v3 with: terraform_version: "1.5.0" # 替换为你的Terraform版本 - name: Terraform Init run: terraform init - name: Terraform Plan run: terraform plan # 仅在合并到主分支时执行Apply,按需添加审批步骤 - name: Terraform Apply if: github.ref == 'refs/heads/main' && github.event_name == 'push' run: terraform apply -auto-approve
4. 优化:复用工作流模板减少重复代码
如果多个模块的Terraform执行逻辑完全一致,可以抽离通用步骤为可复用工作流模板,避免重复编写相同代码:
- 创建模板文件
.github/workflows/terraform-template.yml:
name: Terraform Template on: workflow_call inputs: working-directory: required: true type: string jobs: terraform: runs-on: ubuntu-latest defaults: run: working-directory: ${{ inputs.working-directory }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Terraform uses: hashicorp/setup-terraform@v3 with: terraform_version: "1.5.0" - name: Terraform Init run: terraform init - name: Terraform Plan run: terraform plan - name: Terraform Apply if: github.ref == 'refs/heads/main' && github.event_name == 'push' run: terraform apply -auto-approve
- 模块工作流文件引用模板(以IAM模块为例):
name: Terraform IAM on: push: paths: - 'global/IAM/**' pull_request: paths: - 'global/IAM/**' jobs: terraform: uses: ./.github/workflows/terraform-template.yml with: working-directory: global/IAM
注意事项
- 确保每个模块的
state.tf配置了独立的后端存储(比如S3桶的不同前缀),避免状态文件互相覆盖。 - 如果根目录存在通用Terraform配置(如
providers.tf),若需通用变更触发所有模块,可在每个工作流的paths中添加对应的根目录文件路径,比如- 'providers.tf'。
内容的提问来源于stack exchange,提问作者Stephan Du Toit
相关产品推荐
相关产品推荐

