基础设施即代码(第二版)
基础设施即代码(第二版)
Kief Morris
马晶慧 译
出版时间:2026年05月
页数:424
“基础设施即代码的实践已经从管理服务器发展到了管理完整的技术栈,但这种新技术也带来了复杂性的代价。本书的内容超越了命令本身,将带你深入了解优秀实践背后的设计模式,以及更高层自动化的实现方法。”
——Patrick Debois
DevOpsDays创始人

几年前,“基础设施即代码”还是一个全新的概念。而如今,甚至连银行等保守机构也开始计划向云端迁移,全球各地的开发团队都在尝试构建大型基础设施代码库。这本实用指南将向你展示如何有效地运用开发运维团队开创的原则、实践和模式来管理云时代的基础设施。
本书非常适合系统管理员、基础设施工程师、软件开发人员、团队负责人以及架构师。第二版展示了如何利用云和自动化技术,以简单、安全、快速和负责任的方式更新系统。你将学习如何将一切定义为代码,并运用软件设计和工程实践,通过多个小而松散耦合的组件来构建系统。
本书的内容包括:
● 基础:利用基础设施即代码推动持续变更,提高运维质量标准,使用工具和技术构建基于云的平台。
● 基础设施技术栈:学习如何定义、配置、测试基础设施资源,并持续交付变更。
● 服务器和其他平台:使用模式设计服务器和集群的配置与部署。
● 大型系统和团队:学习工作流程、治理方法和架构模式,创建并管理基础设施组件。
  1. 前言
  2. 第一部分 基础
  3. 第1章 什么是基础设施即代码
  4. 1.1 从铁器时代到云时代
  5. 1.2 基础设施即代码
  6. 1.3 基础设施即代码的优势
  7. 1.4 使用基础设施即代码来优化变更
  8. 1.4.1 反对意见:“我们的变更频率不高,不值得自动化”
  9. 1.4.2 反对意见:“我们应该先构建,然后再自动化”
  10. 1.4.3 反对意见:“我们必须在速度和质量之间做出选择”
  11. 1.5 四个关键指标
  12. 1.6 基础设施即代码的三个核心实践
  13. 1.6.1 核心实践:一切皆定义为代码
  14. 1.6.2 核心实践:持续测试并交付所有正在进行的工作
  15. 1.6.3 核心实践:构建可独立变更的、小而简单的部件
  16. 1.7 小结
  17. 第2章 云时代基础设施的原则
  18. 2.1 原则:假设系统不可靠
  19. 2.2 原则:一切皆可复制
  20. 2.3 陷阱:雪花系统
  21. 2.4 原则:创建一次性系统
  22. 2.5 原则:最小化变化
  23. 2.6 原则:确保所有过程皆可重复
  24. 2.7 小结
  25. 第3章 基础设施平台
  26. 3.1 基础设施系统的组成部分
  27. 3.2 基础设施平台
  28. 3.3 基础设施资源
  29. 3.3.1 计算资源
  30. 3.3.2 存储资源
  31. 3.3.3 网络资源
  32. 3.4 小结
  33. 第4章 核心实践:一切皆定义为代码
  34. 4.1 为什么应将基础设施定义为代码
  35. 4.2 什么可定义为代码
  36. 4.2.1 选择具有外部化配置的工具
  37. 4.2.2 利用版本控制系统管理代码
  38. 4.3 基础设施编程语言
  39. 4.3.1 基础设施脚本
  40. 4.3.2 声明式基础设施语言
  41. 4.3.3 可编程的、命令式基础设施语言
  42. 4.3.4 基础设施的声明式语言与命令式语言
  43. 4.3.5 特定领域的基础设施语言
  44. 4.3.6 基础设施的通用语言与DSL
  45. 4.4 将基础设施即定义为代码的实现原则
  46. 4.4.1 声明式代码和命令式代码的分离
  47. 4.4.2 把基础设施代码当作真正的代码
  48. 4.5 小结
  49. 第二部分 基础设施栈
  50. 第5章 基础设施栈即为代码的构建
  51. 5.1 什么是基础设施堆栈
  52. 5.1.1 栈代码
  53. 5.1.2 栈实例
  54. 5.1.3 配置栈中的服务器
  55. 5.1.4 低级基础设施语言
  56. 5.1.5 高级基础设施语言
  57. 5.2 结构化栈的模式和反模式
  58. 5.2.1 反模式:单体栈
  59. 5.2.2 模式:应用程序组栈
  60. 5.2.3 模式:服务栈
  61. 5.2.4 模式:微栈
  62. 5.3 小结
  63. 第6章 使用栈构建环境
  64. 6.1 环境是什么
  65. 6.1.1 交付环境
  66. 6.1.2 多个生产环境
  67. 6.1.3 环境、一致性和配置
  68. 6.2 构建环境的模式
  69. 6.2.1 反模式:多环境栈
  70. 6.2.2 反模式:复制粘贴环境
  71. 6.2.3 模式:可复用栈
  72. 6.3 构建多栈环境
  73. 6.4 小结
  74. 第7章 配置栈实例
  75. 7.1 通过栈参数创建唯一标识符
  76. 7.2 栈参数示例
  77. 7.3 配置栈的模式
  78. 7.3.1 反模式:手动管理栈参数
  79. 7.3.2 模式:栈环境变量
  80. 7.3.3 模式:脚本化参数
  81. 7.3.4 模式:栈配置文件
  82. 7.3.5 模式:包装栈
  83. 7.3.6 模式:管道栈参数
  84. 7.3.7 模式:栈参数注册表
  85. 7.4 配置注册表
  86. 7.4.1 实现配置注册表
  87. 7.4.2 单个或多个配置注册表
  88. 7.5 将机密作为参数
  89. 7.5.1 加密机密
  90. 7.5.2 无机密授权
  91. 7.5.3 在运行时注入机密
  92. 7.5.4 一次性机密
  93. 7.6 小结
  94. 第8章 核心实践:持续测试与交付
  95. 8.1 为什么要持续测试基础设施代码
  96. 8.1.1 持续测试意味着什么
  97. 8.1.2 基础设施应该测试什么
  98. 8.2 测试基础设施代码的挑战
  99. 8.2.1 挑战:测试声明式代码的价值通常较低
  100. 8.2.2 挑战:基础设施代码的测试速度很慢
  101. 8.2.3 挑战:依赖导致基础设施的测试复杂化
  102. 8.3 渐进式测试
  103. 8.3.1 测试金字塔
  104. 8.3.2 瑞士奶酪测试模型
  105. 8.4 基础设施交付管道
  106. 8.4.1 管道的各个阶段
  107. 8.4.2 阶段内测试的组件范围
  108. 8.4.3 阶段的依赖范围
  109. 8.4.4 阶段所需的平台元素
  110. 8.4.5 交付管道软件和服务
  111. 8.5 生产测试
  112. 8.5.1 无法在生产环境外重现的情况
  113. 8.5.2 管理生产环境测试的风险
  114. 8.6 小结
  115. 第9章 测试基础设施栈
  116. 9.1 基础设施示例
  117. 9.1.1 栈示例
  118. 9.1.2 栈管道示例
  119. 9.2 栈的离线测试阶段
  120. 9.2.1 语法检查
  121. 9.2.2 离线静态代码分析
  122. 9.2.3 使用API的静态代码分析
  123. 9.2.4 使用模拟API测试
  124. 9.3 栈的在线测试阶段
  125. 9.3.1 预览:检查变更的内容
  126. 9.3.2 验证:断言基础设施资源
  127. 9.3.3 结果:证明基础设施正常运行
  128. 9.4 使用测试夹具处理依赖关系
  129. 9.4.1 上游依赖的测试替身
  130. 9.4.2 下游依赖的测试夹具
  131. 9.4.3 重构组件实现隔离
  132. 9.5 栈测试实例的生命周期模式
  133. 9.5.1 模式:持久测试栈
  134. 9.5.2 模式:临时测试栈
  135. 9.5.3 反模式:持久栈和临时栈双阶段
  136. 9.5.4 模式:周期性重建栈
  137. 9.5.5 模式:连续重置栈
  138. 9.6 测试编排
  139. 9.6.1 支持本地测试
  140. 9.6.2 避免与管道工具紧密耦合
  141. 9.6.3 测试编排工具
  142. 9.7 小结
  143. 第三部分 服务器和其他应用程序运行时平台
  144. 第10章 应用程序运行时
  145. 10.1 云原生与应用程序驱动的基础设施
  146. 10.2 应用程序运行时目标
  147. 10.2.1 应用程序的可部署组件
  148. 10.2.2 部署包
  149. 10.3 将应用程序部署到服务器
  150. 10.3.1 在容器中打包应用程序
  151. 10.3.2 将应用程序部署到服务器集群
  152. 10.4 将应用程序部署到集群
  153. 10.5 将应用程序部署到集群的包
  154. 10.6 部署FaaS无服务器应用程序
  155. 10.7 应用程序数据
  156. 10.7.1 数据模式与结构
  157. 10.7.2 云原生应用存储基础设施
  158. 10.8 应用程序连接
  159. 10.9 服务发现
  160. 10.10 小结
  161. 第11章 服务器即代码
  162. 11.1 服务器的组成
  163. 11.2 各个组成部分的来源
  164. 11.3 服务器配置代码
  165. 11.3.1 服务器配置代码模块
  166. 11.3.2 设计服务器配置代码模块
  167. 11.3.3 服务器代码的版本控制和升级
  168. 11.3.4 服务器角色
  169. 11.4 测试服务器代码
  170. 11.4.1 服务器代码的渐进式测试
  171. 11.4.2 服务器代码的测试内容
  172. 11.4.3 服务器代码的测试方法
  173. 11.5 新建服务器实例
  174. 11.5.1 手动新建服务器实例
  175. 11.5.2 使用脚本创建服务器
  176. 11.5.3 使用栈管理工具创建服务器
  177. 11.5.4 配置平台自动创建服务器
  178. 11.5.5 使用网络配置工具构建服务器
  179. 11.6 预构建服务器
  180. 11.6.1 热克隆服务器
  181. 11.6.2 使用服务器快照
  182. 11.6.3 创建干净的服务器镜像
  183. 11.7 配置新的服务器实例
  184. 11.7.1 “煎”服务器实例
  185. 11.7.2 “烘焙”服务器镜像
  186. 11.7.3 结合“烘焙”与“煎”
  187. 11.7.4 创建服务器时应用服务器配置
  188. 11.8 小结
  189. 第12章 服务器变更
  190. 12.1 变更管理模式:何时应用变更
  191. 12.1.1 反模式:变更时应用
  192. 12.1.2 模式:持续同步配置
  193. 12.1.3 模式:不可变服务器
  194. 12.2 应用服务器配置代码的方式
  195. 12.2.1 模式:推送服务器配置
  196. 12.2.2 模式:拉取服务器配置
  197. 12.3 服务器生命周期中的其他事件
  198. 12.3.1 停止与重启服务器实例
  199. 12.3.2 更换服务器实例
  200. 12.3.3 恢复故障服务器
  201. 12.4 小结
  202. 第13章 服务器镜像即代码
  203. 13.1 构建服务器镜像
  204. 13.1.1 为什么要构建服务器镜像
  205. 13.1.2 如何构建服务器镜像
  206. 13.1.3 构建服务器镜像的工具
  207. 13.1.4 在线构建镜像
  208. 13.1.5 离线构建镜像
  209. 13.2 服务器镜像的原内容
  210. 13.2.1 基于标准服务器镜像的构建
  211. 13.2.2 从零构建服务器镜像
  212. 13.2.3 服务器镜像及其内容的来源
  213. 13.3 服务器镜像变更
  214. 13.3.1 重新加热或烘焙新镜像
  215. 13.3.2 服务器镜像的版本控制
  216. 13.3.3 镜像变更时更新服务器实例
  217. 13.3.4 跨团队提供和使用服务器镜像
  218. 13.3.5 处理镜像的重大变更
  219. 13.4 使用管道测试和交付服务器镜像
  220. 13.4.1 服务器镜像的构建阶段
  221. 13.4.2 服务器镜像的测试阶段
  222. 13.4.3 服务器镜像的交付阶段
  223. 13.5 使用多个服务器镜像
  224. 13.5.1 不同基础设施平台的服务器镜像
  225. 13.5.2 不同操作系统的服务器镜像
  226. 13.5.3 不同硬件架构的服务器镜像
  227. 13.5.4 不同角色的服务器镜像
  228. 13.5.5 分层构建服务器镜像
  229. 13.5.6 跨服务器镜像共享代码
  230. 13.6 小结
  231. 第14章 集群即为代码
  232. 14.1 应用程序集群解决方案
  233. 14.1.1 集群即服务
  234. 14.1.2 集群打包发行版
  235. 14.2 应用程序集群的栈拓扑
  236. 14.2.1 使用集群即服务的单体栈
  237. 14.2.2 打包集群解决方案的单体栈
  238. 14.2.3 单体应用程序集群栈的管道
  239. 14.2.4 集群的多栈示例
  240. 14.3 应用程序集群的共享策略
  241. 14.3.1 单一大集群
  242. 14.3.2 交付阶段设置单独的集群
  243. 14.3.3 治理相关的集群
  244. 14.3.4 团队专用集群
  245. 14.3.5 服务网格
  246. 14.4 FaaS无服务器的基础设施
  247. 14.5 小结
  248. 第四部分 设计基础设施
  249. 第15章 核心实践:小而简单的部件
  250. 15.1 模块化设计
  251. 15.1.1 设计良好的组件特征
  252. 15.1.2 组件设计规则
  253. 15.1.3 测试指导设计决策
  254. 15.2 基础设施模块化
  255. 15.2.1 栈组件与栈即组件
  256. 15.2.2 栈中的服务器
  257. 15.3 划分组件的边界
  258. 15.3.1 根据自然变化模式划分边界
  259. 15.3.2 根据组件生命周期划分边界
  260. 15.3.3 根据组织结构划分边界
  261. 15.3.4 创建支持弹性的边界
  262. 15.3.5 创建支持扩展的边界
  263. 15.3.6 根据安全和治理要求划分边界
  264. 15.4 小结
  265. 第16章 利用组件构建栈
  266. 16.1 栈组件的基础设施语言
  267. 16.1.1 通过模块重用声明式代码
  268. 16.1.2 使用库动态创建栈元素
  269. 16.2 栈组件的模式
  270. 16.2.1 模式:外观模块
  271. 16.2.2 反模式:混乱模块
  272. 16.2.3 反模式:非共享模块
  273. 16.2.4 模式:捆绑模块
  274. 16.2.5 反模式:意大利面条式模块
  275. 16.2.6 模式:基础设施域实体
  276. 16.3 构建抽象层
  277. 16.4 小结
  278. 第17章 将栈视为组件
  279. 17.1 发现栈之间的依赖关系
  280. 17.1.1 模式:资源匹配
  281. 17.1.2 模式:栈数据查找
  282. 17.1.3 模式:集成注册表查找
  283. 17.1.4 依赖注入
  284. 17.2 小结
  285. 第五部分 交付基础设施
  286. 第18章 组织基础设施代码
  287. 18.1 组织项目和存储库
  288. 18.1.1 一个存储库还是多个
  289. 18.1.2 单一存储库
  290. 18.1.3 每个项目一个单独的存储库(微存储库)
  291. 18.1.4 拥有多个项目的多个存储库
  292. 18.2 组织不同类型的代码
  293. 18.2.1 项目支持文件
  294. 18.2.2 跨项目测试
  295. 18.2.3 专用集成测试项目
  296. 18.2.4 按域概念组织代码
  297. 18.2.5 组织配置值文件
  298. 18.3 管理基础设施与应用程序代码
  299. 18.3.1 交付基础设施和应用程序
  300. 18.3.2 使用基础设施测试应用程序
  301. 18.3.3 集成之前测试基础设施
  302. 18.3.4 使用基础设施代码部署应用程序
  303. 18.4 小结
  304. 第19章 交付基础设施代码
  305. 19.1 交付基础设施代码概述
  306. 19.1.1 构建基础设施项目
  307. 19.1.2 打包基础设施代码
  308. 19.1.3 使用存储库交付基础设施代码
  309. 19.2 项目集成
  310. 19.2.1 模式:构建时项目集成
  311. 19.2.2 模式:交付时项目集成
  312. 19.2.3 模式:应用时项目集成
  313. 19.3 使用脚本封装基础设施工具
  314. 19.3.1 组装配置值
  315. 19.3.2 简化封装脚本
  316. 19.4 小结
  317. 第20章 团队工作流程
  318. 20.1 人员
  319. 20.2 谁编写基础设施代码
  320. 20.3 将代码应用于基础设施
  321. 20.3.1 从本地工作站应用代码
  322. 20.3.2 通过集中式服务应用代码
  323. 20.3.3 个人基础设施实例
  324. 20.3.4 工作流程中的源代码分支
  325. 20.4 防止配置漂移
  326. 20.4.1 最大限度地减少自动化滞后
  327. 20.4.2 避免临时应用
  328. 20.4.3 持续应用代码
  329. 20.4.4 不可变基础设施
  330. 20.5 基于管道的工作流程中的治理
  331. 20.5.1 重新分配职责
  332. 20.5.2 左移
  333. 20.5.3 基础设施即代码与治理的示例流程
  334. 20.6 小结
  335. 第21章 安全地修改基础设施
  336. 21.1 缩小变更范围
  337. 21.1.1 小改动
  338. 21.1.2 重构示例
  339. 21.2 将不完整的变更推送到生产
  340. 21.2.1 并行实例
  341. 21.2.2 向后兼容转换
  342. 21.2.3 功能开关
  343. 21.3 修改实时的基础设施
  344. 21.3.1 基础设施手术
  345. 21.3.2 扩展与收缩
  346. 21.3.3 零停机变更
  347. 21.4 连续性
  348. 21.4.1 通过预防错误实现连续性
  349. 21.4.2 通过快速恢复实现连续性
  350. 21.4.3 持续灾难恢复
  351. 21.4.4 混沌工程
  352. 21.4.5 为失败做好计划
  353. 21.5 不断变化的系统中的数据连续性
  354. 21.5.1 锁定
  355. 21.5.2 隔离
  356. 21.5.3 复制
  357. 21.5.4 重载
  358. 21.5.5 数据连续性混合法
  359. 21.6 小结
  360. 作者介绍
  361. 封面介绍
书名:基础设施即代码(第二版)
作者:Kief Morris
译者:马晶慧 译
国内出版社:中国电力出版社
出版时间:2026年05月
页数:424
书号:978-7-5239-0999-7
原版书书名:Infrastructure as Code, 2e
原版书出版商:O'Reilly Media
Kief Morris
 
Kief Morris是ThoughtWorks的全球云工程总监,致力于帮助各类组织和团队探索更有效的方法,通过云计算和基础设施技术更快速、更可靠地交付更高价值的成果。他从事自动化IT服务器基础设施的设计、构建和运维已有20多年,最初使用shell脚本和Perl,随着技术的发展,逐步采用了CFengine、Puppet、Chef和Terraform等工具。
 
 
书封面的动物是一只黑白兀鹫(Ruppell’s vulture,学名:Gyps rueppellii),原产于非洲萨赫勒地区(介于撒哈拉沙漠与稀树草原之间)。这种鸟的命名是为纪念19世纪德国动物学家Eduard Rüppell。
这是一种大型鸟类,翼展可达7~8英尺(2.1~2.4米),体重14~20磅(6.4~
9.1公斤),羽毛呈斑驳棕色,颈部和头部为黄色偏白。与所有兀鹫一样,这种鸟是食腐动物,几乎只以腐肉为食。它们用锋利的爪子和喙撕裂尸体上的肉,舌头上还有向后的刺,可彻底刮净骨头。虽然平时很安静,但它们是高度社交的鸟类,会在群居繁殖地或为争夺食物时出尖锐的叫声。
黑白兀鹫是一夫一妻制,终身配偶关系可持续40~50年。繁殖期,成对的雌雄鸟会在悬崖附近筑巢,用树枝、草和树叶搭建,并经常重复使用多年。黑白兀鹫每年只产一枚卵,直到下一个繁殖季开始时,幼鸟才刚刚独立。这种兀鹫的飞行速度不快(约35公里/小时),但它们会飞到离巢90英里(约145公里)外觅食。
根据现有记录,黑白兀鹫是飞得最高的鸟类。有证据显示,它们曾飞至海拔37000英尺(约11278米),高度与商用飞机相当。它们的血液中有特殊的血红蛋白,使其能在高海拔环境中更高效地吸收氧气。
黑白兀鹫被列为濒危物种,数量持续下降。虽然栖息地丧失是一个因素,但最严重的威胁是中毒。农民为了报复狮子或鬣狗等捕食者,常常在牲畜尸体上投毒,结果导致黑白兀鹫无辜被牵连。这种鸟类依靠视觉找到食物并成群聚集,因此导致每次死亡的数量高达几百只。
购买选项
定价:128.00元
书号:978-7-5239-0999-7
出版社:中国电力出版社