《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》從Ansible的模塊運行及Playbook的解析與執(zhí)行兩個方面全面、深入地剖析三個版本的Ansible源碼,此外還會優(yōu)化和改造用于部署Ceph集群的ceph-ansible項目。
《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》共6章:第1章介紹Ansible 1.1的源碼,重點剖析Ansible 1.1的底層通信機制和模塊運行原理;第2章在第1章的基礎上對Ansible 1.9.6的源碼進行解析,重點比較Ansible 1.9.6與Ansible 1.1的源碼有何不同,以及Ansible 1.9.6中Playbook的運行過程;第3章介紹Ansible 2.8中的部分核心模塊及Playbook的常用語法;第4章介紹Ansible 2.8中的核心源碼并完整跟蹤模塊運行的全過程;第5章以小版本的源碼對比及GitHub上相關源碼的Bug溯源兩種方式探討深入學習Ansible源碼的方式;第6章介紹基于Ansible的Playbook項目ceph-ansible,并依據(jù)實際工作需求對其進行改造和深度優(yōu)化,幫助讀者理解Playbook項目的編寫方法。
《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》適合Python初中級程序員閱讀,尤其適合Python運維開發(fā)工程師和Ansible愛好者閱讀。對于Python程序員而言,本書能帶領他們一窺Python項目的內(nèi)部原理,并通過閱讀開源項目的源碼提高編程水平。
前華為核心系統(tǒng)部負責人吳文峰等3位大咖力薦;
中國電信天翼云高級運維開發(fā)工程師全方位、多角度剖析Ansible的核心源碼;
詳細介紹Ansible的常用模塊和Playbook的底層執(zhí)行邏輯;
講解由淺入深,對Ansible的多個版本的源碼進行詳細解讀;
通過大量的源碼測試案例,幫助讀者深入理解Ansible的源碼細節(jié);
深入剖析Ansible的模塊運行原理和Playbook工程項目的運行邏輯;
帶領讀者系統(tǒng)地掌握剖析Python項目源碼的方法。
Python是目前自動化運維領域應用多的語言之一,而基于Python開發(fā)的Ansible則是自動化運維管理的工具。對Python程序員來說,學習Ansible源碼一方面能從中學到不少Python的高級用法,另一方面也能熟練掌握這款流行工具并可以隨時對其進行深度改造和定制,這對他的個人成長至關重要。此外,Ansible源碼中的很多函數(shù)與類均可以在簡單改造后成為運維人員的常用腳本。
初識Ansible 2.8的源碼時,筆者感受到了它的復雜與宏大。單純地分析整個Ansible的源碼及其所有細節(jié)并讓Python初學者接受是一件非常困難的事情,筆者一開始也不打算這么做,直到有一天,筆者在Ansible的官方代碼庫中看到了早發(fā)布的Ansible 1.1,隨后幾天迅速閱讀和調(diào)試完該版本的源碼,終發(fā)現(xiàn)早期的Ansible 1.1與當前的Ansible 2.8有著共同的核心理念,即相同的模塊運行機制及劇本集概念。Ansible 1.1只用非常少的代碼就實現(xiàn)了一個在當時看來十分不錯的運維工具,其核心設計思想一直延續(xù)至今,從未改變。筆者意識到,對于想要深入學習Ansible源碼的運維人員而言,Ansible 1.1的源碼是一份絕佳的入門材料。由淺入深是筆者喜歡用的研究源碼的方式,這樣的理念也促成了《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》的形成。此外,為了幫助讀者理解基于Ansible的Playbook項目,筆者精選了自動部署工具ceph-ansible作為實戰(zhàn)對象,它也是筆者完成各種Playbook項目的參考。
《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》融合了筆者在Ansible源碼方面積累的一些學習心得,從小版本的Ansible源碼,到當前流行的Ansible 2.8源碼,乃至從模塊運行原理,到Playbook的解析與執(zhí)行,其間都有筆者總結(jié)的一些經(jīng)驗。
《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》特色
本書的主要特色有:
按照由淺入深的方式剖析三個經(jīng)典版本的Ansible源碼,每個版本的源碼剖析重點各不相同。
對Ansible 1和Ansible 2中的核心源碼做了大量的測試與實踐,從而輔助讀者更好地理解相關知識。
通過完整對比小版本的Ansible源碼及對GitHub上相關源碼的Bug進行溯源兩種方式,幫助讀者深入學習相關知識,從而吃透Ansible。
完整剖析ceph-ansible項目并深入實踐與改造,幫助讀者更好地理解基于Ansible開發(fā)的Playbook項目。
《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》內(nèi)容
本書主要介紹Ansible的核心源碼與Playbook項目實戰(zhàn),共分為6章。
第1章剖析Ansible 1.1的源碼,重點分析Ansible 1.1的底層通信機制及其模塊運行原理。
第2章剖析Ansible 1.9.6的源碼,并對比它與Ansible 1.1源碼的不同之處,另外還會重點分析Playbook的執(zhí)行邏輯。
第3章介紹Ansible 2.8中部分核心模塊的使用并剖析其源碼,同時還會介紹Playbook的常用語法。
第4章剖析Ansible 2.8的核心源碼。首先進行基礎功能模塊的源碼分析,如常量值定義、inventory文件解析和模板渲染等,接著對Ansible 2.8中模塊運行的全流程及劇本集的運行源碼進行跟蹤和分析。
第5章深入學習Ansible源碼,主要通過小版本的源碼對比和GitHub上相關源碼的Bug溯源兩種方式,幫助讀者熟悉深入學習Ansible源碼的方式。
第6章主要介紹基于Ansible的經(jīng)典項目ceph-ansible,并對該項目進行改造和優(yōu)化。
讀者對象
開源項目的源碼本身既復雜又難懂,想要掌握本書的內(nèi)容,領會筆者的分析思路,讀者需要具備一定的Python基礎,同時要有堅持學習的信念。本書不是幫助Python初學者入門,而是深度剖析Python開源項目的源碼,主要適合以下讀者閱讀:
擁有一定Python基礎的運維人員;
熟練使用Ansible并想深入理解其核心源碼的后端開發(fā)人員;
渴望進入開源世界,探索一個開源項目全貌的初、中級程序員;
高等院校的老師和學生;
相關培訓機構(gòu)的學員。
版本說明
在本書中,Ansible 1、Ansible 2和Ansible 2.8代表的是Ansible的幾個大版本,但并非具體的發(fā)行版本,而Ansible 1.1、Ansible 1.9.6和Ansible 2.8.16分別是各大版本下的具體發(fā)行版本,筆者主要基于這三個發(fā)行版本剖析Ansible的源碼,當然也會提及其他發(fā)行版本。
Ansible源碼獲取方式
《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》涉及的所有源碼均已開源,讀者可以通過https://releases.ansible.com/ansible網(wǎng)站進行下載。也可以在華章公司的網(wǎng)站(www.hzbook.com)上搜索到本書,然后單擊資料下載按鈕,即可在本書頁面上找到下載鏈接。
售后支持
Ansible從版本2開始已經(jīng)變得龐大且臃腫,相關的小版本迭代也在飛速進行。盡管本書剖析的Ansible源碼不是的2.10或者更高的版本,但其核心思想一直未曾改變,這是讀者在學習Ansible源碼時要重點把握的。筆者完成本書的主要資料正是Ansible各個版本的源碼,許多關于Ansible的術語,如動作插件、通信插件等,都是直接翻譯英文注釋而來的,可能會有不當之處,加之筆者水平和精力所限,書中可能還存在一些疏漏與錯誤,敬請各位讀者不吝指正。
致謝
首先感謝我的家人!沒有父母和姐姐給我的鼓勵與支持,就沒有我的今天,我也不會有機會進入計算機行業(yè),更不會有機會完成本書。
感謝我的女朋友黃寶寶!她花費了很多時間和精力幫我整理書稿,并改正書稿中的不當語句和錯別字。
感謝天翼云科技有限公司的領導黃潤懷副總經(jīng)理和我的直接領導林潔琬組長!他們給我們組創(chuàng)造了一個難得的機會,讓我們能全身心投入分布式存儲領域的研發(fā)中。正是這次機會,讓我接觸了Ansible及部署分布式存儲集群的開源工具ceph-deploy和ceph-ansible,從此踏上了Python工具的源碼分析之旅。
感謝媒體存儲小分隊的黃鵠、陳濤、毛廷鴻、譚偉杰、吳文峰和楊佑!他們擁有的豐富的互聯(lián)網(wǎng)產(chǎn)品研發(fā)經(jīng)驗給了我很多幫助,讓本書的寫作比預期順利很多。
感謝本書的編輯歐振旭!他給了我出版本書的機會與動力,讓我得以完成這本心中想了無數(shù)遍的書。
還要感謝為本書的出版提供過幫助的其他編輯和朋友!沒有他們的大力支持,本書也很難與讀者見面。
后感謝本書讀者!你們的肯定與支持會激勵筆者繼續(xù)前行。
……
沈聰 畢業(yè)于武漢大學,獲碩士學位。目前就職于天翼云科技有限公司,任高級后端開發(fā)工程師。曾經(jīng)從事Java開發(fā),后來轉(zhuǎn)崗為Python運維開發(fā),在公司的媒體存儲項目中參與存儲集群建設、集群部署及統(tǒng)一運維管理平臺的開發(fā)工作。喜愛鉆研Python相關工具的源碼,曾經(jīng)研究過Django、Ansible、SaltStack和Scrapy等熱門框架的源碼并做了大量的筆記。在慕課網(wǎng)上發(fā)布過Nginx、Django和Scrapy的相關課程。
第1章 Ansible 1.1源碼剖析 1
1.1 Ansible 1.1的環(huán)境搭建 1
1.1.1 Ansible 1.1測試環(huán)境搭建 1
1.1.2 Ansible 1.1調(diào)試環(huán)境搭建 5
1.2 Ansible 1.1的基本使用 9
1.2.1 Ansible 1.1模塊說明 9
1.2.2 Ansible 1.1的常用模塊 10
1.2.3 編寫Ansible 1.1的Playbook 29
1.2.4 小結(jié) 31
1.3 Ansible 1.1源碼概覽 31
1.3.1 非源碼文件與目錄 31
1.3.2 源碼文件 32
1.3.3 小結(jié) 45
1.4 Ansible 1.1底層通信代碼解析 46
1.4.1 本地連接插件 46
1.4.2 基于paramiko模塊連接插件 53
1.4.3 基于SSH命令連接插件 61
1.4.4 小結(jié) 68
1.5 ping模塊的執(zhí)行流程 68
1.5.1 ansible命令 68
1.5.2 runner目錄下的核心源碼 71
1.5.3 ping模塊的運行流程 84
1.6 copy模塊的執(zhí)行流程 94
1.6.1 copy模塊的動作插件 94
1.6.2 copy模塊遺留問題的解決 96
1.6.3 Ansible模塊的核心步驟小結(jié) 99
1.7 本章小結(jié) 100
第2章 Ansible 1.9.6源碼剖析 101
2.1 Ansible 1.1和Ansible 1.9.6源碼對比 101
2.2 快速上手Ansible 1.9.6 102
2.2.1 搭建Ansible 1.9.6測試環(huán)境 102
2.2.2 Ansible 1.9.6中的部分模塊剖析 103
2.2.3 Ansible 1.9.6中Playbook的常用語法 125
2.3 再探Ansible 1.9.6源碼 134
2.3.1 cache模塊 134
2.3.2 shell_plugins插件 138
2.3.3 filter_plugins插件 142
2.3.4 lookup_plugins插件 145
2.3.5 輔助模塊代碼 148
2.4 追蹤Ansible 1.9.6的模塊運行機制 155
2.4.1 inventory目錄 155
2.4.2 Runner類及其方法 157
2.5 解析Playbook的運行邏輯 171
2.5.1 準備測試的Playbook項目 171
2.5.2 相關類基礎 174
2.5.3 追蹤ansible-playbook命令的運行流程 187
2.6 本章小結(jié) 200
第3章 Ansible 2常用模塊與Playbook語法 201
3.1 快速上手Ansible 2 201
3.2 Ansible 2的命令行使用 203
3.2.1 Ansible 2支持的常見選項 203
3.2.2 Ansible 2中的常用模塊及其源碼解析 215
3.2.3 Ansible 2模塊的學習建議 241
3.3 Ansible 2中的Playbook語法 243
3.3.1 變量 243
3.3.2 條件判斷 248
3.3.3 循環(huán)語句 251
3.3.4 等待語句 256
3.4 本章小結(jié) 260
第4章 Ansible 2核心源碼剖析 261
4.1 Ansible 2.8核心源碼初探 261
4.1.1 日志打印 261
4.1.2 默認配置 262
4.1.3 inventory文件解析 270
4.1.4 模板渲染 289
4.1.5 插件 303
4.2 Ansible 2.8模塊運行的核心流程分析 305
4.2.1 命令入口 306
4.2.2 核心運行模塊 308
4.2.3 流程總結(jié) 354
4.3 Ansible 2.8中Playbook的執(zhí)行流程追蹤 355
4.3.1 Playbook命令執(zhí)行入口 355
4.3.2 核心代碼追蹤 356
4.3.3 Playbook中部分語法的源碼解析 363
4.4 本章小結(jié) 371
第5章 Ansible源碼的演進跟蹤 372
5.1 Ansible 1.1到Ansible 1.2的演進之路 372
5.2 Ansible 2.8中的部分Bug溯源 391
5.2.1 Ansible 2.8中的ChangeLog 391
5.2.2 Ansible 2.8中的Bug復現(xiàn)及其修復過程 394
5.3 如何更深入地學習Ansible源碼 416
第6章 Playbook項目實戰(zhàn) 417
6.1 ceph-ansible項目介紹 417
6.2 ceph-ansible實戰(zhàn) 418
6.2.1 使用ceph-ansible部署Ceph集群 418
6.2.2 ceph-ansible的其他功能 425
6.3 一個真實場景的改造 429
6.3.1 業(yè)務需求 429
6.3.2 手工實現(xiàn) 430
6.3.3 改造ceph-ansible 433
6.4 ceph-ansible項目源碼探索 446
6.4.1 追蹤ceph-mon服務的搭建過程 446
6.4.2 在CentOS 7下部署Ceph集群的簡化版Playbook 469
6.4.3 小結(jié) 479