本书基于实际项目,揭示如何使用Terraform自动扩展和管理基础架构。本书重点介绍了Terraform 0.12的语法、基础知识和高级设计(如零停机时间部署和创建Terraform提供程序)。本书主要内容包括如何使用Terraform,如何管理Terraform资源的生命周期,如何编程,如何在AWS云中部署多层的Web应用程序,如何实现无服务器的部署,如何通过Terraform部署服务器,如何实现零停机部署,如何测试、重构,如何扩展Terraform,如何通过Terraform自动部署,如何实现安全管理。
本书适合作为系统管理员、DevOps工程师、开发人员的自学和参考用书。
1.由浅入深,实战功能强大
为用户提供循序渐进的入门介绍,深入剖析更加复杂的现实模式。随着你逐渐学习零停机时间部署等高级技术,你将系统掌握Terraform的精髓,而不是只能简单地复制和粘贴脚本。
2.专业人士编写,参考性强
业界专业人士编写,实战经验丰富,为用户提供实用建议。
3.专业性强,适合专业人士巩固提升
本书适合熟悉主流云平台的开发人员和运维人员自学阅读。本书提供了使用JavaScript和Go编写的示例。
Scott Winkler是一位DevOps工程师,也是Terraform的专业人士。他在HashiConf和HashiTalks上展示过自己的成果,并且是HashiCorp的核心贡献者。Scott在社区中很活跃,开发了许多模块和提供程序。在空闲时间,Scott喜欢骑马。Scott还负责提供Terraform的独立咨询服务。
目 录
第 一部分 Terraform训练营
第 1章 Terraform入门 3
1.1 Terraform的优点 4
1.1.1 置备工具 5
1.1.2 易于使用 5
1.1.3 免费且开源的软件 5
1.1.4 声明式编程 6
1.1.5 云无关 6
1.1.6 表达能力强且高度可扩展 7
1.2 “Hello Terraform!” 7
1.2.1 编写Terraform配置 8
1.2.2 配置AWS提供程序 10
1.2.3 初始化Terraform 11
1.2.4 部署EC2实例 12
1.2.5 销毁EC2实例 16
1.3 新的“Hello Terraform!” 18
1.3.1 修改Terraform配置 19
1.3.2 应用修改 20
1.3.3 销毁基础设施 20
1.4 炉边谈话 21
小结 21
第 2章 Terraform资源的生命周期 22
2.1 过程概述 22
2.2 声明本地文件资源 24
2.3 初始化工作空间 25
2.4 生成执行计划 26
2.5 创建本地文件资源 30
2.6 执行no-op 34
2.7 更新本地文件资源 35
2.7.1 检测配置漂移 39
2.7.2 terraform refresh 41
2.8 删除本地文件资源 42
2.9 炉边谈话 44
小结 44
第3章 函数式编程 45
3.1 有趣的Mad Libs 46
3.1.1 输入变量 47
3.1.2 使用变量定义文件赋值 48
3.1.3 验证变量 49
3.1.4 打乱列表 49
3.1.5 函数 51
3.1.6 输出值 52
3.1.7 模板 53
3.1.8 生成输出结果 54
3.2 生成许多Mad Libs故事 55
3.2.1 for表达式 56
3.2.2 局部值 57
3.2.3 隐式依赖 58
3.2.4 count元实参 60
3.2.5 条件表达式 61
3.2.6 更多模板 62
3.2.7 本地文件 63
3.2.8 压缩文件 64
3.2.9 应用修改 67
3.3 炉边谈话 68
小结 69
第4章 在AWS中部署多层Web应用程序 70
4.1 架构 71
4.2 Terraform模块 73
4.2.1 模块的语法 73
4.2.2 根模块 74
4.2.3 标准模块结构 74
4.3 根模块 75
4.4 网络模块 78
4.5 数据库模块 82
4.5.1 从网络模块传递数据 83
4.5.2 生成随机密码 84
4.6 自动扩展模块 86
4.6.1 下滴数据 86
4.6.2 模板化cloudinit_config 88
4.7 部署Web应用程序 92
4.8 炉边谈话 93
小结 94
第二部分 现实环境下的Terraform
第5章 简单的无服务器部署 97
5.1 “两美分网站” 98
5.2 架构和计划 100
5.3 编写代码 104
5.3.1 资源组 105
5.3.2 存储容器 106
5.3.3 存储blob 107
5.3.4 Function应用 108
5.3.5 最终润色 111
5.4 部署到Azure 114
5.5 将Azure资源管理器与Terraform结合起来 116
5.5.1 部署不支持的资源 116
5.5.2 从遗留代码迁移 117
5.5.3 生成配置代码 118
5.6 炉边谈话 119
小结 119
第6章 与朋友协同使用
Terraform 120
6.1 标准后端和增强后端 120
6.2 开发S3后端模块 121
6.2.1 架构 122
6.2.2 扁平模块 123
6.2.3 编写代码 124
6.3 共享模块 130
6.3.1 GitHub 130
6.3.2 Terraform注册表 131
6.4 每人一个S3后端 133
6.4.1 部署S3后端 133
6.4.2 在S3后端存储状态 135
6.5 在工作空间中复用配置代码 138
6.5.1 部署多个环境 139
6.5.2 清理 142
6.6 Terraform Cloud简介 143
6.7 炉边谈话 144
小结 144
第7章 CI/CD管道即代码 145
7.1 两个部署 146
7.2 GCP上的Docker容器的CI/CD 147
7.2.1 设计管道 147
7.2.2 施工设计 148
7.3 初始工作空间设置 149
7.4 动态配置和置备程序 151
7.4.1 for_each与count 152
7.4.2 使用置备程序执行脚本 153
7.4.3 带有local-exec置备程序的null资源 155
7.4.4 处理重复的配置块 156
7.4.5 动态块 158
7.5 配置无服务器容器 160
7.6 部署静态基础设施 162
7.7 Docker容器的CI/CD 165
7.8 炉边谈话 168
小结 169
第8章 多云MMORPG 170
8.1 混合云负载均衡 171
8.1.1 架构概览 172
8.1.2 代码 174
8.1.3 部署 176
8.2 在Nomad集群联邦上部署一个MMORPG 178
8.2.1 集群联邦基础 179
8.2.2 架构 179
8.2.3 阶段1:静态基础设施 181
8.2.4 阶段2:动态基础设施 186
8.2.5 准备玩家1 189
8.3 使用托管服务重新设计MMORPG 190
8.3.1 代码 191
8.3.2 准备玩家2 192
8.4 炉边谈话 193
小结 194
第三部分 精通Terraform
第9章 零停机时间部署 197
9.1 自定义生命周期 198
9.1.1 使用create_before_destroy实现零停机时间部署 198
9.1.2 其他考虑因素 200
9.2 蓝/绿部署 201
9.2.1 架构 202
9.2.2 代码 204
9.2.3 部署 204
9.2.4 蓝/绿切换 206
9.2.5 其他考虑因素 207
9.3 配置管理 208
9.3.1 将Terraform和Ansible组合起来 208
9.3.2 代码 209
9.3.3 基础设施部署 215
9.3.4 应用程序部署 216
9.4 炉边谈话 218
小结 218
第 10章 测试和重构 220
10.1 置备自助基础设施 221
10.1.1 架构 221
10.1.2 代码 222
10.1.3 预部署 224
10.1.4 污染和轮转访问密钥 225
10.2 重构Terraform配置 227
10.2.1 模块化代码 227
10.2.2 模块展开 229
10.2.3 使用局部值替换多行字符串 231
10.2.4 循环多个模块实例 233
10.2.5 新的IAM模块 234
10.3 迁移Terraform状态 236
10.3.1 状态文件的结构 236
10.3.2 移动资源 237
10.3.3 重新部署 238
10.3.4 导入资源 239
10.4 测试基础设施即代码 242
10.4.1 编写一个基本的Terraform测试 243
10.4.2 测试套件 245
10.4.3 运行测试 247
10.5 炉边谈话 247
小结 248
第 11章 通过编写自定义提供程序扩展Terraform 249
11.1 Terraform提供程序的蓝图 250
11.1.1 Terraform提供程序的基础知识 250
11.1.2 Pestore提供程序的架构 251
11.2 编写Petstore提供程序 253
11.2.1 设置Go项目 253
11.2.2 配置提供程序模式 254
11.3 创建宠物资源 257
11.3.1 定义Create() 259
11.3.2 定义Read() 261
11.3.3 定义Update() 262
11.3.4 定义Delete() 263
11.4 编写验收测试 265
11.4.1 测试提供程序模式 265
11.4.2 测试宠物资源 266
11.5 生成、测试、部署 268
11.5.1 部署Petstore API 268
11.5.2 测试和生成提供程序 270
11.5.3 安装提供程序 271
11.5.4 宠物即代码 271
11.6 炉边谈话 275
小结 276
第 12章 自动化Terraform 277
12.1 仿造版的Terraform Enterprise 278
12.1.1 对Terraform Enterprise实施逆向工程 278
12.1.2 设计细节 280
12.2 从根级别开始 281
12.3 开发一个Terraform CI/CD管道 282
12.3.1 声明输入变量 282
12.3.2 IAM角色和策略 283
12.3.3 构建计划和应用阶段 286
12.3.4 配置环境变量 289
12.3.5 声明管道即代码 291
12.3.6 最终代码 294
12.4 部署Terraform CI/CD 管道 297
12.4.1 创建源代码仓库 297
12.4.2 创建最小特权部署策略 298
12.4.3 配置Terraform变量 299
12.4.4 部署到AWS 299
12.4.5 连接到GitHub 301
12.5 使用管道部署“Hello World!” 301
12.6 炉边谈话 305
小结 306
第 13章 安全和密钥管理 307
13.1 保护Terraform 状态 308
13.1.1 从Terraform状态删除不必要的密钥 308
13.1.2 使用最小特权访问控制 312
13.1.3 静态加密 313
13.2 保护日志 314
13.2.1 哪些敏感信息会被泄露 315
13.2.2 local-exec置备程序的危险 317
13.2.3 外部数据源的危险 317
13.2.4 HTTP提供程序的危险 319
13.2.5 限制日志访问 320
13.3 管理静态密钥 320
13.3.1 环境变量 320
13.3.2 Terraform变量 322
13.3.3 重定向敏感的Terraform 变量 324
13.4 使用动态密钥 325
13.4.1 HashiCorp Vault 326
13.4.2 AWS Secrets Manager 327
13.5 Sentinel和策略即代码 328
13.5.1 编写一个基本的Sentinel策略 329
13.5.2 阻塞local-exec置备程序 330
13.6 结语 331
小结 331
附录A AWS身份验证 333
附录B Azure身份验证 335
附录C GCP身份验证 337
附录D 使用Shell提供程序
创建自定义资源 339
附录E 创建Petstore
数据源 344