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