第一部分 基礎
第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
第二部分 模式
第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 基於Unikernel構建模闆 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
第三部分 實踐
第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
· · · · · · (
收起)