第一部分 基础 3
第1章 挑战与原则 3
1.1为什么采用基础设施即代码 3
1.2什么是基础设施即代码 4
1.3动态基础设施的挑战 5
1.3.1服务器蔓延 5
1.3.2配置漂移 6
1.3.3雪花服务器 6
1.3.4脆弱的基础设施 7
1.3.5自动化恐惧症 7
1.3.6侵蚀 8
1.4基础设施即代码的原则 8
1.4.1系统能够轻松复制 8
1.4.2系统是用完可扔的 9
1.4.3系统是一致的 10
1.4.4过程是可重复的 10
1.4.5设计经常变更 10
1.5实践 11
1.5.1使用定义文件 11
1.5.2自文档化的系统和流程 11
1.5.3一切版本化 12
1.5.4持续测试系统和流程 13
1.5.5小的变更,而不是批量变更 13
1.5.6让服务持续可用 13
1.6反脆弱性:超越“稳健性” 14
1.7结语 15
1.8下一步 15
第2章 动态基础设施平台 16
2.1什么是动态基础设施平台 16
2.2对动态基础设施平台的要求 17
2.2.1可编程 17
2.2.2按需获取 19
2.2.3自服务 19
2.3平台提供的基础设施资源 19
2.3.1计算资源 20
2.3.2存储资源 20
2.3.3网络资源 22
2.4动态基础设施平台的类型 23
2.4.1公有IaaS云 23
2.4.2社区IaaS云 23
2.4.3私有IaaS云 23
2.4.4反模式:手摇云 24
2.4.5混合云服务 24
2.4.6裸机云 24
2.5如何选择动态基础设施平台 25
2.5.1公有还是私有 25
2.5.2云的可移植性 27
2.6与云和虚拟化的“机械通感” 29
2.7结语 30
第3章 基础设施定义工具 31
3.1选择基础设施即代码的工具 31
3.1.1需求:脚本接口 32
3.1.2需求:无人值守的命令行工具 32
3.1.3需求:支持无人值守的执行 33
3.1.4需求:外部化配置 34
3.2配置定义文件 36
3.3使用基础设施定义工具 37
3.3.1用过程化脚本置备基础设施 38
3.3.2声明式定义基础设施 40
3.3.3使用基础设施定义工具 41
3.3.4配置服务器 41
3.4配置注册表 42
3.4.1轻量级配置注册表 42
3.4.2配置注册表是CMDB吗 43
3.4.3 CMDB的审计与修复反模式 44
3.4.4 CMDB的基础设施即代码方式 44
3.5结语 44
第4章 服务器配置工具 45
4.1自动化服务器管理的目标 45
4.2具有不同的服务器管理功能的工具 46
4.2.1创建服务器的工具 46
4.2.2配置服务器的工具 47
4.2.3打包服务器模板的工具 48
4.2.4在服务器上运行命令的工具 49
4.2.5从中央注册中心获取配置 50
4.3服务器变更管理模型 51
4.3.1临时变更管理 51
4.3.2配置同步 51
4.3.3不可变的基础设施 51
4.3.4容器化服务 52
4.4容器 52
4.4.1以容器方式和非容器方式管理Ruby应用程序 53
4.4.2容器是虚拟机吗 54
4.4.3使用容器而不是虚拟机 55
4.4.4运行容器 56
4.4.5安全和容器 56
4.5结语 58
第5章 基础服务概述 59
5.1基础设施服务和工具的考虑 59
5.1.1支持外部配置的工具优先 60
5.1.2假定基础设施是动态的工具优先 61
5.1.3具有云兼容许可的产品优先 61
5.1.4支持松耦合的产品优先 62
5.2团队之间共享服务 62
5.3监控:告警、指标和日志 63
5.3.1告警:出现问题时告诉我 64
5.3.2指标:收集和分析数据 65
5.3.3日志聚合和分析 65
5.4发现服务 66
5.4.1服务器端的服务发现模式 67
5.4.2客户端的服务发现模式 67
5.5分布式进程管理 67
5.5.1使用服务器角色编排进程 67
5.5.2使用容器编排进程 67
5.5.3调度短期任务 68
5.5.4容器编排工具 68
5.6软件部署 68
5.6.1部署流水线软件 68
5.6.2打包软件 69
5.7结语 70
第二部分 模式 73
第6章 置备服务器的模式 73
6.1服务器置备 74
6.1.1服务器的生命周期 74
6.1.2服务器都承载了什么 77
6.1.3服务器上东西的类型 77
6.1.4服务器角色 79
6.2创建服务器的模式 80
6.2.1反模式:手动制作服务器 80
6.2.2实践:将服务器创建参数放在脚本中 81
6.2.3反模式:热克隆服务器 82
6.2.4模式:服务器模板 82
6.2.5反模式:雪花工厂 82
6.3引导新服务器的模式 83
6.3.1推送引导 83
6.3.2拉取引导 84
6.3.3实践:对每个新服务器实例进行冒烟测试 84
6.4结语 85
第7章 管理服务器模板的模式 86
7.1供应模板:不能让别人来做吗 86
7.2使用模板置备服务器 87
7.2.1创建时置备服务器 87
7.2.2在模板中置备 88
7.2.3平衡模板和创建之间的置备工作 88
7.3构建服务器模板的流程 89
7.4原始镜像 90
7.4.1反模式:热复制服务器模板 90
7.4.2基于操作系统安装镜像烘焙模板 91
7.4.3基于供应镜像烘焙模板 91
7.4.4基于Unikemel构建模板 92
7.4.5在不启动服务器的情况下自定义服务器模板 92
7.5更新服务器模板 92
7.5.1重新烘烤模板 93
7.5.2烘焙新模板 93
7.5.3版本控制服务器模板 93
7.6 构建基于角色的模板 95
7.6.1模式:分层模板 95
7.6.2共享模板的基础脚本 96
7.7自动化服务器模板管理 96
7.7.1在烘焙前自定义服务器 96
7.7.2实践:自动测试服务器模板 97
7.8结语 97
第8章 服务器更新与变更模式 98
8.1服务器变更管理模型 99
8.1.1临时性变更管理 99
8.1.2持续配置同步 99
8.1.3不可变服务器 99
8.1.4容器化服务器 100
8.2通用模式和实践 100
8.2.1实践:最小化服务器模板 101
8.2.2实践:当服务器模板变更时更换服务器 101
8.2.3模式:凤凰服务器 101
8.3持续部署的模式与实践 102
8.3.1模式:无主服务器的配置管理 102
8.3.2实践:应用Cron 103
8.3.3持续同步流 104
8.3.4未配置领域 104
8.4不可变服务器的模式与实践 106
8.4.1服务器镜像作为制品 106
8.4.2使用不可变服务器简化确认管理工具 106
8.4.3不可变服务器流程 107
8.4.4使用不可变服务器引导配置 108
8.4.5事务性服务器更新 109
8.5管理配置定义的实践 109
8.5.1实践:保持配置定义最小化 109
8.5.2组织定义 110
8.5.3实践:使用测试驱动开发来驱动良好的设计 110
8.6结语 110
第9章 定义基础设施的模式 111
9.1环境 112
9.1.1反模式:手动制作的基础设施 112
9.1.2定义基础设施栈即代码 112
9.1.3反模式:每个环境单独的定义文件 114
9.1.4模式:可重用的定义文件 114
9.1.5实践:测试并推进栈定义 115
9.1.6自服务的环境 116
9.2组织基础设施 116
9.2.1反模式:单体栈 116
9.2.2迁移基础设施时避免“直接迁移” 118
9.2.3将应用程序环境分到不同的栈中 118
9.2.4管理栈之间的配置参数 119
9.2.5共享基础设施元素 120
9.2.6实践:应用程序代码和基础设施代码一起管理 122
9.2.7共享定义的方法 123
9.2.8实践:基础设施设计要与变更范围匹配 124
9.2.9示例:微服务的基础设施设计 125
9.3运行定义工具 128
9.4结语 128
第三部分 实践 131
第10章 基础设施的软件工程实践 131
10.1系统质量 132
10.1.1低质量的系统很难变更 132
10.1.2高质量的系统能更容易、更安全地变更 132
10.1.3基于代码的基础设施质量 133
10.1.4快速反馈 133
10.2基础设施管理的版本控制系统 133
10.3持续集成 134
10.3.1持续测试分支不是持续集成 134
10.3.2谁破坏了构建 136
10.3.3忽略失败的测试 137
10.3.4针对基础设施的持续集成 137
10.4持续交付 137
10.4.1集成阶段的问题 137
10.4.2部署流水线和变更流水线 138
10.4.3持续交付不是持续部署 139
10.5代码质量 140
10.5.1整洁代码 140
10.5.2实践:管理技术债务 140
10.6管理重大的基础设施变更 141
10.7结语 142
第11章 测试基础设施变更 143
11.1敏捷测试方法 144
11.1.1自动化测试提供快速反馈 144
11.1.2有机地构建一个测试套件 145
11.2构建测试套件:测试金字塔 145
11.2.1避免失衡的测试套件 146
11.2.2实践:尽可能在最低层级进行测试 147
11.2.3实践:仅实现需要的层级 148
11.2.4实践:经常删减测试套件 148
11.2.5实践:持续评审测试的有效性 148
11.3实现均衡的测试套件 149
11.3.1低层级测试 150
11.3.2中间层级测试 151
11.3.3高层级测试 154
11.3.4测试运维质量 155
11.4管理测试代码 156
11.4.1实践:将测试代码与所测代码放在一起 156
11.4.2反模式:反射测试 156
11.4.3隔离组件进行测试的技巧 157
11.4.4重构组件以便隔离 158
11.4.5管理外部依赖 158
11.4.6测试设置 159
11.5测试的角色和工作流 161
11.5.1原则:人们应该为所构建的东西编写测试 161
11.5.2编写测试的习惯 162
11.5.3原则:每个人都应该能够使用测试工具 162
11.5.4质量分析师的价值 162
11.5.5测试驱动开发 163
11.6结语 164
第12章 基础设施的变更管理流水线 165
12.1变更管理流水线的好处 166
12.2设计流水线的准则 166
12.2.1确保每个阶段的一致性 167
12.2.2对于每个变更都立即得到反馈 167
12.2.3在手动阶段之前运行自动阶段 168
12.2.4尽早获得类生产环境 168
12.3基本流水线设计 169
12.3.1本地开发阶段 169
12.3.2构建阶段 169
12.3.3发布配置制品 170
12.3.4自动化测试阶段 171
12.3.5手动验证阶段 172
12.3.6上线 173
12.3.7流水线的节奏 173
12.4使用流水线的实践 174
12.4.1实践:证明每个变更都对生产准备就绪 174
12.4.2实践:每个变更都始于流水线起点 175
12.4.3实践:出现错误时停止流水线 175
12.5扩展流水线到更复杂的系统 175
12.5.1模式:扇入型流水线 176
12.5.2实践:保持较短的流水线 179
12.5.3实践:解耦流水线 179
12.5.4集成模型 180
12.6处理组件之间依赖的技巧 181
12.6.1模式:库依赖 181
12.6.2模式:自置备的服务实例 183
12.6.3提供预发布的库构建 183
12.6.4为消费者提供服务的测试实例 184
12.6.5将服务的测试实例用作消费者 185
12.7管理组件间接口的实践 186
12.7.1实践:保证接口的向后兼容性 186
12.7.2实践:从发布解耦部署 186
12.7.3实践:使用版本相容 187
12.7.4实践:提供测试替身 187
12.7.5实践:用契约测试来测试提供者 188
12.7.6实践:用参考消费者来测试 188
12.7.7实践:提供者接口的冒烟测试 188
12.7.8实践:运行消费者驱动契约测试 188
12.8结语 189
第13章 基础设施团队的工作流 190
13.1任何可以自动化的都要自动化 190
13.1.1手动变更 191
13.1.2临时的自动化 191
13.1.3自主的自动化 192
13.1.4自主的自动化工作流 193
13.2使用本地沙箱 194
13.2.1使用本地虚拟化做沙箱 194
13.2.2具有本地测试的工作流示例 196
13.2.3使用虚拟化平台做沙箱 197
13.3代码库组织模式 197
13.3.1反模式:基于分支的代码库 198
13.3.2模式:每个组件一个主干 199
13.3.3模式:单一主干 199
13.4工作流的效率 199
13.4.1加快变更 199
13.4.2代码评审 200
13.4.3将治理融入工作流 200
13.5结语 202
第14章 动态基础设施的连续性 203
14.1服务连续性 204
14.1.1真实可用性 204
14.1.2用动态服务器池做恢复 205
14.1.3为动态基础设施设计软件 206
14.1.4为连续性划分系统 208
14.2零停机变更 208
14.2.1模式:蓝绿替换 209
14.2.2模式:凤凰替换 209
14.2.3实践:缩小替换的范围 210
14.2.4模式:金丝雀替换 211
14.2.5为零停机替换路由流量 212
14.2.6有数据的零停机变更 213
14.3数据连续性 214
14.3.1冗余地复制数据 214
14.3.2重新生成数据 215
14.3.3委托数据持久化 215
14.3.4备份到持久存储 215
14.4灾难恢复 216
14.4.1持续的灾难恢复 217
14.4.2灾备计划:为灾难做计划 218
14.4.3实践:优先重建而不是冷备份 218
14.4.4通过流水线持续监控 219
14.5安全 220
14.5.1自动掩盖危害 220
14.5.2以可靠的更新作为防护 221
14.5.3包的来源 221
14.5.4自动加固 222
14.5.5流水线中安全验证的自动化 223
14.5.6变更流水线的漏洞 223
14.5.7管理云账号的安全风险 224
14.6结语 225
第15章 基础设施即代码的组织要求 226
15.1演进式架构 226
15.1.1在实战中学习 228
15.1.2从先驱者流水线开始 228
15.2度量有效性 229
15.2.1首先对期望的结果达成一致 229
15.2.2选择有助于团队的度量指标 230
15.2.3跟踪和改善周期时间 230
15.2.4使用看板可视化工作 232
15.2.5回顾会议及事后分析 233
15.3组织授权用户 233
15.3.1划分功能模型的陷阱 233
15.3.2采取自服务模型 235
15.3.3承担全部责任:谁构建,谁运行 235
15.3.4组织跨职能团队 236
15.4持续变更管理的治理 237
15.4.1提供稳固的构建单元 237
15.4.2在流水线中证明运维就绪 238
15.4.3共享运维质量的所有权 238
15.4.4审查和审计自动化流程 238
15.4.5优化发现和修复问题的时间 239
15.5结语:永无止境 239
关于作者 240
关于封面 240