跳到主要内容

IaC 最佳实践

核心原则

原则说明
一切皆代码基础设施定义、配置、策略全部版本控制
不可变基础设施不修改运行中的服务器,而是替换新版本
环境一致性dev/staging/production 用同一套代码+不同参数
最小权限CI/CD Pipeline 的云凭证只授予必要权限
代码审查基础设施变更和应用代码一样需要 Code Review

可变 vs 不可变基础设施

不可变基础设施的优势
  • 无配置漂移:每次部署都是全新的、一致的环境
  • 可回滚:保留旧版本镜像,秒级回滚
  • 可审计:镜像构建过程完全可追溯

Secret 管理

绝不能将密钥明文存储在代码仓库中。

方案工具适用场景
加密文件Ansible Vault、SOPS小规模
密钥管理服务HashiCorp Vault、AWS Secrets Manager中大规模
K8s SecretSealed Secrets、External SecretsK8s 环境

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: 什么是配置漂移?如何避免?

答案

配置漂移是指服务器的实际状态和代码定义的期望状态不一致,通常由手动变更导致。避免方法:

  1. 禁止手动变更:所有修改通过 IaC 代码提交
  2. 不可变基础设施:不修改运行中的实例,而是用新镜像替换
  3. 定期校验:Ansible --check 模式或 Terraform plan 检测偏差
  4. 权限控制:生产环境 SSH 权限严格限制

Q2: Terraform State 冲突怎么办?

答案

  1. 远程 Backend + 状态锁:使用 S3 + DynamoDB(或 Consul),自动加锁防并发
  2. CI/CD 串行执行:同一环境的 apply 不并行
  3. 手动解锁terraform force-unlock <LOCK_ID>(确认无人操作时)
  4. State 分割:按模块/层级拆分 State,减少冲突范围

相关链接