IaC 最佳实践
核心原则
| 原则 | 说明 |
|---|---|
| 一切皆代码 | 基础设施定义、配置、策略全部版本控制 |
| 不可变基础设施 | 不修改运行中的服务器,而是替换新版本 |
| 环境一致性 | dev/staging/production 用同一套代码+不同参数 |
| 最小权限 | CI/CD Pipeline 的云凭证只授予必要权限 |
| 代码审查 | 基础设施变更和应用代码一样需要 Code Review |
可变 vs 不可变基础设施
不可变基础设施的优势
- 无配置漂移:每次部署都是全新的、一致的环境
- 可回滚:保留旧版本镜像,秒级回滚
- 可审计:镜像构建过程完全可追溯
Secret 管理
绝不能将密钥明文存储在代码仓库中。
| 方案 | 工具 | 适用场景 |
|---|---|---|
| 加密文件 | Ansible Vault、SOPS | 小规模 |
| 密钥管理服务 | HashiCorp Vault、AWS Secrets Manager | 中大规模 |
| K8s Secret | Sealed Secrets、External Secrets | K8s 环境 |
SOPS + Age 加密示例
# 加密文件
sops --encrypt --age age1xxx... secrets.yaml > secrets.enc.yaml
# 解密
sops --decrypt secrets.enc.yaml
.sops.yaml(配置加密规则)
creation_rules:
- path_regex: .*\.enc\.yaml$
age: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
CI/CD 集成
.github/workflows/terraform.yml
name: Terraform
on:
pull_request:
paths: ['terraform/**']
jobs:
plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- name: Terraform Init
run: terraform init
working-directory: terraform/environments/production
- name: Terraform Plan
run: terraform plan -out=plan.tfplan
working-directory: terraform/environments/production
# PR 评论中展示 Plan 结果
- uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '```\n' + planOutput + '\n```'
})
apply:
needs: plan
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production # 需要手动审批
steps:
- name: Terraform Apply
run: terraform apply -auto-approve
常见面试问题
Q1: 什么是配置漂移?如何避免?
答案:
配置漂移是指服务器的实际状态和代码定义的期望状态不一致,通常由手动变更导致。避免方法:
- 禁止手动变更:所有修改通过 IaC 代码提交
- 不可变基础设施:不修改运行中的实例,而是用新镜像替换
- 定期校验:Ansible
--check模式或 Terraform plan 检测偏差 - 权限控制:生产环境 SSH 权限严格限制
Q2: Terraform State 冲突怎么办?
答案:
- 远程 Backend + 状态锁:使用 S3 + DynamoDB(或 Consul),自动加锁防并发
- CI/CD 串行执行:同一环境的 apply 不并行
- 手动解锁:
terraform force-unlock <LOCK_ID>(确认无人操作时) - State 分割:按模块/层级拆分 State,减少冲突范围