本書(shū)基于實(shí)際項(xiàng)目,揭示如何使用Terraform自動(dòng)擴(kuò)展和管理基礎(chǔ)架構(gòu)。本書(shū)重點(diǎn)介紹了Terraform 0.12的語(yǔ)法、基礎(chǔ)知識(shí)和高級(jí)設(shè)計(jì)(如零停機(jī)時(shí)間部署和創(chuàng)建Terraform提供程序)。本書(shū)主要內(nèi)容包括如何使用Terraform,如何管理Terraform資源的生命周期,如何編程,如何在AWS云中部署多層的Web應(yīng)用程序,如何實(shí)現(xiàn)無(wú)服務(wù)器的部署,如何通過(guò)Terraform部署服務(wù)器,如何實(shí)現(xiàn)零停機(jī)部署,如何測(cè)試、重構(gòu),如何擴(kuò)展Terraform,如何通過(guò)Terraform自動(dòng)部署,如何實(shí)現(xiàn)安全管理。
本書(shū)適合作為系統(tǒng)管理員、DevOps工程師、開(kāi)發(fā)人員的自學(xué)和參考用書(shū)。
1.由淺入深,實(shí)戰(zhàn)功能強(qiáng)大
為用戶提供循序漸進(jìn)的入門(mén)介紹,深入剖析更加復(fù)雜的現(xiàn)實(shí)模式。隨著你逐漸學(xué)習(xí)零停機(jī)時(shí)間部署等高級(jí)技術(shù),你將系統(tǒng)掌握Terraform的精髓,而不是只能簡(jiǎn)單地復(fù)制和粘貼腳本。
2.專業(yè)人士編寫(xiě),參考性強(qiáng)
業(yè)界專業(yè)人士編寫(xiě),實(shí)戰(zhàn)經(jīng)驗(yàn)豐富,為用戶提供實(shí)用建議。
3.專業(yè)性強(qiáng),適合專業(yè)人士鞏固提升
本書(shū)適合熟悉主流云平臺(tái)的開(kāi)發(fā)人員和運(yùn)維人員自學(xué)閱讀。本書(shū)提供了使用JavaScript和Go編寫(xiě)的示例。
Scott Winkler是一位DevOps工程師,也是Terraform的專業(yè)人士。他在HashiConf和HashiTalks上展示過(guò)自己的成果,并且是HashiCorp的核心貢獻(xiàn)者。Scott在社區(qū)中很活躍,開(kāi)發(fā)了許多模塊和提供程序。在空閑時(shí)間,Scott喜歡騎馬。Scott還負(fù)責(zé)提供Terraform的獨(dú)立咨詢服務(wù)。
目 錄
第 一部分 Terraform訓(xùn)練營(yíng)
第 1章 Terraform入門(mén) 3
1.1 Terraform的優(yōu)點(diǎn) 4
1.1.1 置備工具 5
1.1.2 易于使用 5
1.1.3 免費(fèi)且開(kāi)源的軟件 5
1.1.4 聲明式編程 6
1.1.5 云無(wú)關(guān) 6
1.1.6 表達(dá)能力強(qiáng)且高度可擴(kuò)展 7
1.2 “Hello Terraform!” 7
1.2.1 編寫(xiě)Terraform配置 8
1.2.2 配置AWS提供程序 10
1.2.3 初始化Terraform 11
1.2.4 部署EC2實(shí)例 12
1.2.5 銷毀EC2實(shí)例 16
1.3 新的“Hello Terraform!” 18
1.3.1 修改Terraform配置 19
1.3.2 應(yīng)用修改 20
1.3.3 銷毀基礎(chǔ)設(shè)施 20
1.4 爐邊談話 21
小結(jié) 21
第 2章 Terraform資源的生命周期 22
2.1 過(guò)程概述 22
2.2 聲明本地文件資源 24
2.3 初始化工作空間 25
2.4 生成執(zhí)行計(jì)劃 26
2.5 創(chuàng)建本地文件資源 30
2.6 執(zhí)行no-op 34
2.7 更新本地文件資源 35
2.7.1 檢測(cè)配置漂移 39
2.7.2 terraform refresh 41
2.8 刪除本地文件資源 42
2.9 爐邊談話 44
小結(jié) 44
第3章 函數(shù)式編程 45
3.1 有趣的Mad Libs 46
3.1.1 輸入變量 47
3.1.2 使用變量定義文件賦值 48
3.1.3 驗(yàn)證變量 49
3.1.4 打亂列表 49
3.1.5 函數(shù) 51
3.1.6 輸出值 52
3.1.7 模板 53
3.1.8 生成輸出結(jié)果 54
3.2 生成許多Mad Libs故事 55
3.2.1 for表達(dá)式 56
3.2.2 局部值 57
3.2.3 隱式依賴 58
3.2.4 count元實(shí)參 60
3.2.5 條件表達(dá)式 61
3.2.6 更多模板 62
3.2.7 本地文件 63
3.2.8 壓縮文件 64
3.2.9 應(yīng)用修改 67
3.3 爐邊談話 68
小結(jié) 69
第4章 在AWS中部署多層Web應(yīng)用程序 70
4.1 架構(gòu) 71
4.2 Terraform模塊 73
4.2.1 模塊的語(yǔ)法 73
4.2.2 根模塊 74
4.2.3 標(biāo)準(zhǔn)模塊結(jié)構(gòu) 74
4.3 根模塊 75
4.4 網(wǎng)絡(luò)模塊 78
4.5 數(shù)據(jù)庫(kù)模塊 82
4.5.1 從網(wǎng)絡(luò)模塊傳遞數(shù)據(jù) 83
4.5.2 生成隨機(jī)密碼 84
4.6 自動(dòng)擴(kuò)展模塊 86
4.6.1 下滴數(shù)據(jù) 86
4.6.2 模板化cloudinit_config 88
4.7 部署Web應(yīng)用程序 92
4.8 爐邊談話 93
小結(jié) 94
第二部分 現(xiàn)實(shí)環(huán)境下的Terraform
第5章 簡(jiǎn)單的無(wú)服務(wù)器部署 97
5.1 “兩美分網(wǎng)站” 98
5.2 架構(gòu)和計(jì)劃 100
5.3 編寫(xiě)代碼 104
5.3.1 資源組 105
5.3.2 存儲(chǔ)容器 106
5.3.3 存儲(chǔ)blob 107
5.3.4 Function應(yīng)用 108
5.3.5 最終潤(rùn)色 111
5.4 部署到Azure 114
5.5 將Azure資源管理器與Terraform結(jié)合起來(lái) 116
5.5.1 部署不支持的資源 116
5.5.2 從遺留代碼遷移 117
5.5.3 生成配置代碼 118
5.6 爐邊談話 119
小結(jié) 119
第6章 與朋友協(xié)同使用
Terraform 120
6.1 標(biāo)準(zhǔn)后端和增強(qiáng)后端 120
6.2 開(kāi)發(fā)S3后端模塊 121
6.2.1 架構(gòu) 122
6.2.2 扁平模塊 123
6.2.3 編寫(xiě)代碼 124
6.3 共享模塊 130
6.3.1 GitHub 130
6.3.2 Terraform注冊(cè)表 131
6.4 每人一個(gè)S3后端 133
6.4.1 部署S3后端 133
6.4.2 在S3后端存儲(chǔ)狀態(tài) 135
6.5 在工作空間中復(fù)用配置代碼 138
6.5.1 部署多個(gè)環(huán)境 139
6.5.2 清理 142
6.6 Terraform Cloud簡(jiǎn)介 143
6.7 爐邊談話 144
小結(jié) 144
第7章 CI/CD管道即代碼 145
7.1 兩個(gè)部署 146
7.2 GCP上的Docker容器的CI/CD 147
7.2.1 設(shè)計(jì)管道 147
7.2.2 施工設(shè)計(jì) 148
7.3 初始工作空間設(shè)置 149
7.4 動(dòng)態(tài)配置和置備程序 151
7.4.1 for_each與count 152
7.4.2 使用置備程序執(zhí)行腳本 153
7.4.3 帶有l(wèi)ocal-exec置備程序的null資源 155
7.4.4 處理重復(fù)的配置塊 156
7.4.5 動(dòng)態(tài)塊 158
7.5 配置無(wú)服務(wù)器容器 160
7.6 部署靜態(tài)基礎(chǔ)設(shè)施 162
7.7 Docker容器的CI/CD 165
7.8 爐邊談話 168
小結(jié) 169
第8章 多云MMORPG 170
8.1 混合云負(fù)載均衡 171
8.1.1 架構(gòu)概覽 172
8.1.2 代碼 174
8.1.3 部署 176
8.2 在Nomad集群聯(lián)邦上部署一個(gè)MMORPG 178
8.2.1 集群聯(lián)邦基礎(chǔ) 179
8.2.2 架構(gòu) 179
8.2.3 階段1:靜態(tài)基礎(chǔ)設(shè)施 181
8.2.4 階段2:動(dòng)態(tài)基礎(chǔ)設(shè)施 186
8.2.5 準(zhǔn)備玩家1 189
8.3 使用托管服務(wù)重新設(shè)計(jì)MMORPG 190
8.3.1 代碼 191
8.3.2 準(zhǔn)備玩家2 192
8.4 爐邊談話 193
小結(jié) 194
第三部分 精通Terraform
第9章 零停機(jī)時(shí)間部署 197
9.1 自定義生命周期 198
9.1.1 使用create_before_destroy實(shí)現(xiàn)零停機(jī)時(shí)間部署 198
9.1.2 其他考慮因素 200
9.2 藍(lán)/綠部署 201
9.2.1 架構(gòu) 202
9.2.2 代碼 204
9.2.3 部署 204
9.2.4 藍(lán)/綠切換 206
9.2.5 其他考慮因素 207
9.3 配置管理 208
9.3.1 將Terraform和Ansible組合起來(lái) 208
9.3.2 代碼 209
9.3.3 基礎(chǔ)設(shè)施部署 215
9.3.4 應(yīng)用程序部署 216
9.4 爐邊談話 218
小結(jié) 218
第 10章 測(cè)試和重構(gòu) 220
10.1 置備自助基礎(chǔ)設(shè)施 221
10.1.1 架構(gòu) 221
10.1.2 代碼 222
10.1.3 預(yù)部署 224
10.1.4 污染和輪轉(zhuǎn)訪問(wèn)密鑰 225
10.2 重構(gòu)Terraform配置 227
10.2.1 模塊化代碼 227
10.2.2 模塊展開(kāi) 229
10.2.3 使用局部值替換多行字符串 231
10.2.4 循環(huán)多個(gè)模塊實(shí)例 233
10.2.5 新的IAM模塊 234
10.3 遷移Terraform狀態(tài) 236
10.3.1 狀態(tài)文件的結(jié)構(gòu) 236
10.3.2 移動(dòng)資源 237
10.3.3 重新部署 238
10.3.4 導(dǎo)入資源 239
10.4 測(cè)試基礎(chǔ)設(shè)施即代碼 242
10.4.1 編寫(xiě)一個(gè)基本的Terraform測(cè)試 243
10.4.2 測(cè)試套件 245
10.4.3 運(yùn)行測(cè)試 247
10.5 爐邊談話 247
小結(jié) 248
第 11章 通過(guò)編寫(xiě)自定義提供程序擴(kuò)展Terraform 249
11.1 Terraform提供程序的藍(lán)圖 250
11.1.1 Terraform提供程序的基礎(chǔ)知識(shí) 250
11.1.2 Pestore提供程序的架構(gòu) 251
11.2 編寫(xiě)Petstore提供程序 253
11.2.1 設(shè)置Go項(xiàng)目 253
11.2.2 配置提供程序模式 254
11.3 創(chuàng)建寵物資源 257
11.3.1 定義Create() 259
11.3.2 定義Read() 261
11.3.3 定義Update() 262
11.3.4 定義Delete() 263
11.4 編寫(xiě)驗(yàn)收測(cè)試 265
11.4.1 測(cè)試提供程序模式 265
11.4.2 測(cè)試寵物資源 266
11.5 生成、測(cè)試、部署 268
11.5.1 部署Petstore API 268
11.5.2 測(cè)試和生成提供程序 270
11.5.3 安裝提供程序 271
11.5.4 寵物即代碼 271
11.6 爐邊談話 275
小結(jié) 276
第 12章 自動(dòng)化Terraform 277
12.1 仿造版的Terraform Enterprise 278
12.1.1 對(duì)Terraform Enterprise實(shí)施逆向工程 278
12.1.2 設(shè)計(jì)細(xì)節(jié) 280
12.2 從根級(jí)別開(kāi)始 281
12.3 開(kāi)發(fā)一個(gè)Terraform CI/CD管道 282
12.3.1 聲明輸入變量 282
12.3.2 IAM角色和策略 283
12.3.3 構(gòu)建計(jì)劃和應(yīng)用階段 286
12.3.4 配置環(huán)境變量 289
12.3.5 聲明管道即代碼 291
12.3.6 最終代碼 294
12.4 部署Terraform CI/CD 管道 297
12.4.1 創(chuàng)建源代碼倉(cāng)庫(kù) 297
12.4.2 創(chuàng)建最小特權(quán)部署策略 298
12.4.3 配置Terraform變量 299
12.4.4 部署到AWS 299
12.4.5 連接到GitHub 301
12.5 使用管道部署“Hello World!” 301
12.6 爐邊談話 305
小結(jié) 306
第 13章 安全和密鑰管理 307
13.1 保護(hù)Terraform 狀態(tài) 308
13.1.1 從Terraform狀態(tài)刪除不必要的密鑰 308
13.1.2 使用最小特權(quán)訪問(wèn)控制 312
13.1.3 靜態(tài)加密 313
13.2 保護(hù)日志 314
13.2.1 哪些敏感信息會(huì)被泄露 315
13.2.2 local-exec置備程序的危險(xiǎn) 317
13.2.3 外部數(shù)據(jù)源的危險(xiǎn) 317
13.2.4 HTTP提供程序的危險(xiǎn) 319
13.2.5 限制日志訪問(wèn) 320
13.3 管理靜態(tài)密鑰 320
13.3.1 環(huán)境變量 320
13.3.2 Terraform變量 322
13.3.3 重定向敏感的Terraform 變量 324
13.4 使用動(dòng)態(tài)密鑰 325
13.4.1 HashiCorp Vault 326
13.4.2 AWS Secrets Manager 327
13.5 Sentinel和策略即代碼 328
13.5.1 編寫(xiě)一個(gè)基本的Sentinel策略 329
13.5.2 阻塞local-exec置備程序 330
13.6 結(jié)語(yǔ) 331
小結(jié) 331
附錄A AWS身份驗(yàn)證 333
附錄B Azure身份驗(yàn)證 335
附錄C GCP身份驗(yàn)證 337
附錄D 使用Shell提供程序
創(chuàng)建自定義資源 339
附錄E 創(chuàng)建Petstore
數(shù)據(jù)源 344