跳转至

自动化与 IaC:把运维写成代码

1. 这一章讲什么

前面各章的每个阶段(CI/CD、测试、监控)背后都是自动化。这一章把它扶正为主角:先给自动化划范围(IT/业务/RPA/工业四类,DevOps 关心第一类),再逐阶段讲自动化做什么、用什么指标度量;然后落到本章的硬核——基础设施即代码(IaC) 和它的代表工具 Ansible(playbook、模块、角色、幂等)。

2. 顶层全景

  DevOps 五阶段 × 自动化: Build(自动拉码/编译/打包) → Test(自动跑测试) → Deploy(自动发布)
                              → Operate(IaC 自动配环境) → Monitor(自动采集/告警)
  IaC 一句话:   声明式(要什么) vs 命令式(怎么做)——Ansible/Terraform 是前者
  Ansible 三件事: 无代理(SSH 就够) + YAML playbook + 幂等(重复跑结果一样)

3. 核心原理

3.1 自动化的收益与代价

书里给了一组有冲击力的数字:Amazon 的自动化让开发者平均每 11.7 秒部署一次、每天超过 10 万次部署1。四大收益:速度(小时级→分钟级)、伸缩(流量来了自动加机器)、一致性(脚本不会「看心情」)、标准化(全公司同一套模板)2。代价也如实列了:初始投入高、缺人、legacy 难集成、工具选型难、安全合规、脚本维护难、ROI 难量化3。

3.2 五个阶段各自的自动化与度量

阶段 自动化做什么 最有意思的度量指标(书里表格)
Build 自动拉码、编译、打包 构建队列时间、修复坏构建的时长
Test 单测/集成/系统/UI 自动跑 自动化覆盖率(已自动化用例占比)、MTTD/MTTR
Deploy 环境建模 + 自动推送 自动回滚时长、并发部署数
Operate IaC 供给/配置基础设施 幂等率(脚本跑多少次结果一致的比例)、资源浪费率
Monitor 自动采集指标日志、异常检测、告警 告警疲劳指数(无效告警占比)

这些指标表(表 11.1–11.5)是本章最实用的部分——每个阶段自动化得好不好,都有数可量4。

3.3 IaC:声明「要什么」,别说「怎么做」

IaC = 用代码定义基础设施,存进 Git,可审查、可复用、可跨环境重复5。它和传统脚本的本质区别是声明式 vs 命令式:

声明式(IaC) 命令式(脚本)
你写 state: present(确保包装了) apt install nginx(跑安装命令)
关心 结果 步骤
重复执行 天然幂等 要自己写判断防重复
例子 Ansible、Terraform、Kubernetes YAML Bash、Python 脚本

书里对照表(表 11.6)还给了可复用性、可读性、扩展性三行:模块和变量让 IaC 能参数化复用,脚本往往是硬编码6。

两条 Ansible/Terraform 代码示例照抄原书:Ansible 在 webservers 组装 Apache5;Terraform 在 AWS 起一台 t2.micro EC27。

3.4 Ansible 解剖

来历:2012 年 Michael DeHaan(Red Hat 前工程师)为「简单、无代理、安全」而造,2015 年被 Red Hat 收购8。

三特性9:

  1. 无代理(agentless):目标机器什么都不用装,控制机通过 SSH(Windows 用 WinRM)直接管;
  2. YAML playbook:人话写的任务清单;
  3. 幂等(idempotent):跑一百遍和跑一遍结果一样。

积木四块10:

  • ad-hoc 命令:一行速查,ansible webservers -m ping;
  • playbook:YAML 文件,一组按序执行的任务,ansible-playbook site.yml;
  • module:真正干活的积木(apt、service、copy、file……几百个内置);
  • roles:把 playbook 按职责拆成可复用的目录结构(roles/webserver/tasks/main.yml),主 playbook 只剩 roles: [webserver, website, database] 三行——书里的完整例子是「装 nginx + 拷网站文件 + 装 MySQL」三角色部署11。
  • 还有 collections(ansible-galaxy collection install amazon.aws):模块的打包分发格式12。

幂等的正例与反例(书里最诚实的一段13):声明 amazon.aws.ec2_instance: state: present 反复跑会重复创建 EC2 实例(AWS 侧不按名字去重);而 OpenStack 的 openstack.cloud.server 反复跑只有一台 VM。结论:幂等是「模块在目标系统支持去重时」的性质,不是所有模块天然如此——选型时要验证。机制:模块动手前先查当前状态,一致就跳过,报告 ok 而非 changed13。

push vs pull:push(默认)是控制机主动 SSH 推给目标;pull 是每台目标机跑 ansible-pull 从 Git 拉 playbook 自己执行——超大规模环境 pull 更易伸缩14。

3.5 落地:从小处开始,别大爆炸

最佳实践四条15:

  1. Start small:先自动化「高频、规则化、耗几分钟、易错」的任务(每天手工建测试库、拷构建产物);书里警告了「大爆炸自动化」——一个冲刺里同时上 K8s+Terraform+Jenkins+安全扫描,团队搞不懂工具间怎么交互,排错无门,比不自动化还糟。
  2. 环境一致性:Win 笔记本(Python 3.11 + SQLite)上能跑的脚本,到了 Linux 生产机(Python 3.8 + PostgreSQL)就炸——OS 版本、依赖、环境变量都要对齐;工具就是前面各章的 IaC + 容器 + Git + CI/CD16。
  3. 安全内建:密码/API key 不许写进脚本(用 Ansible Vault、HashiCorp Vault、AWS Secrets Manager);自动化工具别给 root 全权限;推代码时自动跑静态扫描(SonarQube/Snyk/Checkmarx),部署前扫镜像漏洞(Trivy、Clair)17。
  4. 接入 CI/CD 的红线:短命分支勤合并,禁 big-bang 合并;不许绕过评审强推主分支(用受保护分支 + 强制 merge request);构建一次、同一构件逐级晋升,别每个环境重新构建(不一致的温床);secret 不进仓库/镜像/日志;别依赖单一 CI runner18。

挑战与边界:初始投入(CapEx)、legacy 集成难、技能缺口、变更阻力、运维负担;以及什么时候该停手——过度自动化:为用 IaC 起一台临时测试 VM 搭五层校验、为改两行 HTML 建三阶段流水线,复杂度远超任务价值19。

未来三词20:AIOps(日志/指标/追踪实时关联)、Policy-as-Code(安全治理规则代码化、每阶段自动执行)、NoOps(运维全自动化——书里的态度是「方向对,但不会适合所有组织」)。

4. 作者的判断与证据

有出处的:Amazon 11.7 秒/次部署的数据有脚注(引用自行业博客,非一手论文,精度存疑);Ansible 各机制与官方文档一致,幂等反例(EC2 vs OpenStack)是难得的诚实教学13。

作者的判断:「从小处开始」「防过度自动化」是经验之谈,方向正确;「NoOps 是趋势」是推测,书中自己加了限定。

我们的补充:Terraform 2023 年从 MPL 转为 BSL 许可证引发社区分裂、OpenTofu 分叉——书里只客观陈述了许可证变化(在 7.4.2 节提到 OpenTofu),未展开;声明式配置与 Kubernetes 期望状态模型同源(书里分别讲了,没点破)(补充,不在书里)。

5. 边界与局限

  • Chef/Puppet/SaltStack/Terraform 各只有一段定位,实操全押 Ansible。
  • Ansible 的变量、handler、template、vault 等进阶机制未展开。
  • 安全的合规自动化(DevSecOps)只列工具名。
  • 未讨论自动化失败时的回退与人因(Human factors)设计。

6. 可带走的

  1. 自动化四收益:速度、伸缩、一致、标准;代价是先花钱花时间23。
  2. 每阶段有各自的度量指标;Operate 阶段看幂等率,Monitor 阶段看告警疲劳指数4。
  3. IaC 的本质:声明「要什么状态」,工具自己凑;命令式脚本要自己管步骤和防重6。
  4. Ansible 三特性:无代理、YAML、幂等;四积木:ad-hoc、playbook、module、role910。
  5. 幂等不是所有模块天然成立——AWS EC2 的 state: present 会重复创建,OpenStack 不会;选型要验证13。
  6. push 控制机说了算,pull 目标机自己拉——超大规模选 pull14。
  7. 落地四原则:小处起步、环境一致、安全内建、接 CI/CD 守红线(构建一次、逐级晋升)1518。
  8. 过度自动化是真实风险:临时 VM 别配五层校验19。

7. 原文地图

主题 原书章 原文位置
Amazon 部署频率数字 11 - Automation text/16-ch11-11-automation.txt:105(搜「every 11.7 s」)
自动化收益与代价 11 - Automation text/16-ch11-11-automation.txt:96(搜「Automation benefits in DevOps」)
五阶段与指标表 11 - Automation text/16-ch11-11-automation.txt:133(搜「Automation in DevOps phases」)
IaC 定义与两代码例 11 - Automation text/16-ch11-11-automation.txt:249(搜「writing and executing code to set up infrastructure」)
IaC vs 脚本对照 11 - Automation text/16-ch11-11-automation.txt:305(搜「Usually declarative」)
四工具定位(Ansible/Terraform/Chef/Puppet) 11 - Automation text/16-ch11-11-automation.txt:322(搜「agentless architecture」)
Ansible 来历与三特性 11 - Automation text/16-ch11-11-automation.txt:369(搜「Michael DeHaan」)
playbook/module/role 示例 11 - Automation text/16-ch11-11-automation.txt:442(搜「Install nginx」) · text/16-ch11-11-automation.txt:544(搜「website_project」)
幂等正例与反例 11 - Automation text/16-ch11-11-automation.txt:625(搜「Create an EC2 instance」)
push vs pull 11 - Automation text/16-ch11-11-automation.txt:664(搜「pull model」)
声明式 vs 命令式 11 - Automation text/16-ch11-11-automation.txt:685(搜「what the final state should be」)
最佳实践四条 11 - Automation text/16-ch11-11-automation.txt:727(搜「Start from small」)
安全清单 11 - Automation text/16-ch11-11-automation.txt:782(搜「Ansible Vault」)
CI/CD 集成红线 11 - Automation text/16-ch11-11-automation.txt:811(搜「building once and promoting」)
过度自动化 11 - Automation text/16-ch11-11-automation.txt:825(搜「Overautomation」)
未来:AIOps/Policy-as-Code/NoOps 11 - Automation text/16-ch11-11-automation.txt:853(搜「NoOps」)

  1. 出处:「11 - Automation」第 104–107 段(text/16-ch11-11-automation.txt:105,搜「every 11.7 s」)。数据源为行业博客,书中注明。 ↩

  2. 出处:「11 - Automation」第 102–117 段(text/16-ch11-11-automation.txt:103,搜「speed, consistency, scalability」)。 ↩↩

  3. 出处:「11 - Automation」第 97–101 段(text/16-ch11-11-automation.txt:98,搜「high initial setup cost」)。 ↩↩

  4. 出处:「11 - Automation」表 11.1–11.5(text/16-ch11-11-automation.txt:157–:242)。 ↩↩

  5. 出处:「11 - Automation」第 244–277 段(text/16-ch11-11-automation.txt:249,搜「writing and executing code」;:254 搜「Install and start Apache」)。 ↩↩

  6. 出处:「11 - Automation」表 11.6 与第 279–286 段(text/16-ch11-11-automation.txt:282,搜「what the system should look like」)。 ↩↩

  7. 出处:「11 - Automation」第 266–277 段(text/16-ch11-11-automation.txt:271,搜「aws_instance」)。 ↩

  8. 出处:「11 - Automation」第 368–373 段(text/16-ch11-11-automation.txt:369,搜「Michael DeHaan」)。 ↩

  9. 出处:「11 - Automation」第 375–378 段(text/16-ch11-11-automation.txt:376,搜「Agentless」)。 ↩↩

  10. 出处:「11 - Automation」第 422–535 段(命令语法 :424;playbook :435;module :515;collection :526)。 ↩↩

  11. 出处:「11 - Automation」第 537–609 段(text/16-ch11-11-automation.txt:544,搜「website_project」)。 ↩

  12. 出处:「11 - Automation」第 526–535 段(text/16-ch11-11-automation.txt:531,搜「ansible-galaxy collection install」)。 ↩

  13. 出处:「11 - Automation」第 623–662 段(text/16-ch11-11-automation.txt:642,搜「another EC2 instance」;:657 搜「only one VM」)。 ↩↩↩↩

  14. 出处:「11 - Automation」第 664–681 段(text/16-ch11-11-automation.txt:678,搜「ansible-pull」)。 ↩↩

  15. 出处:「11 - Automation」第 727–757 段(text/16-ch11-11-automation.txt:728,搜「start small」;:738 搜「big bang automation」)。 ↩↩

  16. 出处:「11 - Automation」第 759–776 段(text/16-ch11-11-automation.txt:762,搜「Windows laptop」)。 ↩

  17. 出处:「11 - Automation」第 778–795 段(text/16-ch11-11-automation.txt:782,搜「Ansible Vault, HashiCorp」;:794 搜「Trivy」)。 ↩

  18. 出处:「11 - Automation」第 796–815 段(text/16-ch11-11-automation.txt:811,搜「building once and promoting」)。 ↩↩

  19. 出处:「11 - Automation」第 817–829 段(text/16-ch11-11-automation.txt:825,搜「Overautomation」)。 ↩↩

  20. 出处:「11 - Automation」第 845–859 段(text/16-ch11-11-automation.txt:853,搜「NoOps」)。 ↩