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