自动化与 IaC:把运维写成代码
自动化与 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:
- 无代理(agentless):目标机器什么都不用装,控制机通过 SSH(Windows 用 WinRM)直接管;
- YAML playbook:人话写的任务清单;
- 幂等(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:
- Start small:先自动化「高频、规则化、耗几分钟、易错」的任务(每天手工建测试库、拷构建产物);书里警告了「大爆炸自动化」——一个冲刺里同时上 K8s+Terraform+Jenkins+安全扫描,团队搞不懂工具间怎么交互,排错无门,比不自动化还糟。
- 环境一致性:Win 笔记本(Python 3.11 + SQLite)上能跑的脚本,到了 Linux 生产机(Python 3.8 + PostgreSQL)就炸——OS 版本、依赖、环境变量都要对齐;工具就是前面各章的 IaC + 容器 + Git + CI/CD16。
- 安全内建:密码/API key 不许写进脚本(用 Ansible Vault、HashiCorp Vault、AWS Secrets Manager);自动化工具别给 root 全权限;推代码时自动跑静态扫描(SonarQube/Snyk/Checkmarx),部署前扫镜像漏洞(Trivy、Clair)17。
- 接入 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. 可带走的
- 自动化四收益:速度、伸缩、一致、标准;代价是先花钱花时间23。
- 每阶段有各自的度量指标;Operate 阶段看幂等率,Monitor 阶段看告警疲劳指数4。
- IaC 的本质:声明「要什么状态」,工具自己凑;命令式脚本要自己管步骤和防重6。
- Ansible 三特性:无代理、YAML、幂等;四积木:ad-hoc、playbook、module、role910。
- 幂等不是所有模块天然成立——AWS EC2 的
state: present会重复创建,OpenStack 不会;选型要验证13。 - push 控制机说了算,pull 目标机自己拉——超大规模选 pull14。
- 落地四原则:小处起步、环境一致、安全内建、接 CI/CD 守红线(构建一次、逐级晋升)1518。
- 过度自动化是真实风险:临时 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」) |
Footnotes
-
出处:「11 - Automation」第 104–107 段(
text/16-ch11-11-automation.txt:105,搜「every 11.7 s」)。数据源为行业博客,书中注明。 ↩ -
出处:「11 - Automation」第 102–117 段(
text/16-ch11-11-automation.txt:103,搜「speed, consistency, scalability」)。 ↩ ↩2 -
出处:「11 - Automation」第 97–101 段(
text/16-ch11-11-automation.txt:98,搜「high initial setup cost」)。 ↩ ↩2 -
出处:「11 - Automation」表 11.1–11.5(
text/16-ch11-11-automation.txt:157–:242)。 ↩ ↩2 -
出处:「11 - Automation」第 244–277 段(
text/16-ch11-11-automation.txt:249,搜「writing and executing code」;:254搜「Install and start Apache」)。 ↩ ↩2 -
出处:「11 - Automation」表 11.6 与第 279–286 段(
text/16-ch11-11-automation.txt:282,搜「what the system should look like」)。 ↩ ↩2 -
出处:「11 - Automation」第 266–277 段(
text/16-ch11-11-automation.txt:271,搜「aws_instance」)。 ↩ -
出处:「11 - Automation」第 368–373 段(
text/16-ch11-11-automation.txt:369,搜「Michael DeHaan」)。 ↩ -
出处:「11 - Automation」第 375–378 段(
text/16-ch11-11-automation.txt:376,搜「Agentless」)。 ↩ ↩2 -
出处:「11 - Automation」第 422–535 段(命令语法
:424;playbook:435;module:515;collection:526)。 ↩ ↩2 -
出处:「11 - Automation」第 537–609 段(
text/16-ch11-11-automation.txt:544,搜「website_project」)。 ↩ -
出处:「11 - Automation」第 526–535 段(
text/16-ch11-11-automation.txt:531,搜「ansible-galaxy collection install」)。 ↩ -
出处:「11 - Automation」第 623–662 段(
text/16-ch11-11-automation.txt:642,搜「another EC2 instance」;:657搜「only one VM」)。 ↩ ↩2 ↩3 ↩4 -
出处:「11 - Automation」第 664–681 段(
text/16-ch11-11-automation.txt:678,搜「ansible-pull」)。 ↩ ↩2 -
出处:「11 - Automation」第 727–757 段(
text/16-ch11-11-automation.txt:728,搜「start small」;:738搜「big bang automation」)。 ↩ ↩2 -
出处:「11 - Automation」第 759–776 段(
text/16-ch11-11-automation.txt:762,搜「Windows laptop」)。 ↩ -
出处:「11 - Automation」第 778–795 段(
text/16-ch11-11-automation.txt:782,搜「Ansible Vault, HashiCorp」;:794搜「Trivy」)。 ↩ -
出处:「11 - Automation」第 796–815 段(
text/16-ch11-11-automation.txt:811,搜「building once and promoting」)。 ↩ ↩2 -
出处:「11 - Automation」第 817–829 段(
text/16-ch11-11-automation.txt:825,搜「Overautomation」)。 ↩ ↩2 -
出处:「11 - Automation」第 845–859 段(
text/16-ch11-11-automation.txt:853,搜「NoOps」)。 ↩