·Python基礎(chǔ)知識(shí),簡(jiǎn)單介紹語言特性。
·如何自動(dòng)處理文本,編寫命令行工具和自動(dòng)處理文件系統(tǒng)。
·Linux實(shí)用程序、包管理、構(gòu)建系統(tǒng)、監(jiān)控、監(jiān)測(cè)和自動(dòng)化測(cè)試。
·云計(jì)算、IaC、Kubernetes和Serverless。
·站在DevOps的角度探討機(jī)器學(xué)習(xí)和數(shù)據(jù)工程。
·構(gòu)建、部署和優(yōu)化一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目。
前言
一次,Noah 在海中游泳,突然一波海浪襲來,把他卷入深水,無法呼吸。他掙扎著,奮力游出水面,可是海浪一波未平一波又侵襲而來。他的體力漸漸不支,慢慢沉入海中。而他沒有放棄,還在拼命掙扎,但是海浪并沒有停歇的意思。在與海浪的殊死搏斗中,他的體力所剩無幾,他不知道自己會(huì)不會(huì)命喪于此。他無法呼吸,渾身無力,真害怕自己會(huì)溺水身亡。直面死亡的恐懼使他認(rèn)識(shí)到,要想活命就必須保存體力、隨波逐流,不能一味掙扎。
不使用DevOps 的初創(chuàng)企業(yè)就像Noah 那一次的經(jīng)歷一樣,讓人心驚膽戰(zhàn)。生產(chǎn)環(huán)境中的火情頻繁,幾個(gè)月得不到解決;一切都是手動(dòng)操作的,連續(xù)幾天被警報(bào)消息吵醒……這樣的問題持續(xù)下去,犧牲的只能是你的健康。脫離死亡漩渦的唯一出路就是DevOps。
萬事開頭難,逐個(gè)解決問題,總有一天能打通整個(gè)環(huán)節(jié)。可以先搭建一個(gè)服務(wù)器,著手測(cè)試代碼,并把目前手動(dòng)執(zhí)行的任務(wù)自動(dòng)化。一定要做點(diǎn)什么,做什么都可以,重要的是行動(dòng)。先把第一步走穩(wěn),而且要實(shí)現(xiàn)自動(dòng)化。
初創(chuàng)企業(yè),也可以說所有公司面臨的一個(gè)共通性問題是,總想尋求“救世主”來解決問題。性能有瓶頸:“我們需要性能工程師”;銷售不利:“我們需要首席營收官”;部署流程不暢:“我們需要DevOps 工程師”。
在某公司,Noah 的一個(gè)項(xiàng)目持續(xù)了一年多,期間使用不同語言重寫了三次Web 應(yīng)用。
現(xiàn)在只需要找一個(gè)“性能工程師”掃尾了。記得當(dāng)時(shí)只有筆者初生牛犢不怕虎,問了句“性能工程師是做什么的”。性能工程師負(fù)責(zé)解決一切彈性伸縮問題。那一刻,Noah 突然認(rèn)識(shí)到,他們是在尋找“救世主”。對(duì)救世主的依賴最能揭示新產(chǎn)品或初創(chuàng)企業(yè)危機(jī)四伏的狀況。連自己都拯救不了的人何談?wù)日麄(gè)公司。
在其他一些公司,Noah 經(jīng)常聽到這樣的抱怨:“要是能雇一個(gè)資深Erlang 工程師多好”“要是能雇一個(gè)人幫我們?cè)黾訝I收多好”“要是能雇一個(gè)人教我們規(guī)范財(cái)務(wù)制度多好”“要是能雇一個(gè)Swift 開發(fā)者多好”……難道多雇這么一個(gè)人,你的初創(chuàng)企業(yè)或新產(chǎn)品就能存活下來嗎?即便真有這樣的救世主,也要找到癥結(jié)所在方能力挽狂瀾。
對(duì)于寄希望于雇一位性能工程師的公司來說,真正的癥結(jié)在于技術(shù)監(jiān)督不力,在于用人不當(dāng)(對(duì)真正能解決問題的人大喊大叫是解決不了問題的)。工作表現(xiàn)不好的人就解雇,讓知道如何解決問題的團(tuán)隊(duì)成員發(fā)聲,推翻當(dāng)前的工作清單從頭來過,調(diào)入合格的工程管理人員,這樣性能問題將迎刃而解,根本不用救世主降臨。
在創(chuàng)業(yè)的路上,不要指望別人;你和你所在的團(tuán)隊(duì)要設(shè)法保護(hù)自己,通力合作,規(guī)范流程,篤信未來。遇到問題,不是再雇一個(gè)人就能解決的;出現(xiàn)問題,要客觀、認(rèn)真地分析,找出根源所在,一步一步地行動(dòng),最終找到解決方案。求人不如求己,根本沒什么救世主。
就像在風(fēng)暴中即將溺水的人一樣,能拯救你(或公司)的人只有你自己。你就是公司要找的那個(gè)救世主,或許你會(huì)發(fā)現(xiàn),你的同事也是。
混亂的狀況也是有出路的,且聽我們慢慢道來。
DevOps 在筆者心中的含義
軟件行業(yè)中很多抽象的概念是無法準(zhǔn)確定義的,云計(jì)算、敏捷和大數(shù)據(jù)就是如此,這些概念如何定義,取決于參與討論的是哪些人。鑒于此,筆者不打算給DevOps下一個(gè)嚴(yán)格的定義。下面簡(jiǎn)單說一下DevOps 出現(xiàn)的必然因素:
?? 開發(fā)和運(yùn)維團(tuán)隊(duì)雙向合作。
?? 把幾天甚至幾周的運(yùn)維任務(wù)精簡(jiǎn)到幾分鐘到幾小時(shí)。
?? 讓開發(fā)人員積極參與,不然還是開發(fā)與運(yùn)維各自為戰(zhàn)。
?? 運(yùn)維人員需要具備一定的開發(fā)技能,至少要懂Bash 和Python。
?? 開發(fā)人員需要具備一定的運(yùn)維技能。開發(fā)人員的職責(zé)不限于編寫代碼,還要負(fù)責(zé)把系統(tǒng)部署到生產(chǎn)環(huán)境并監(jiān)控異常。
?? 自動(dòng)化、自動(dòng)化、自動(dòng)化。不掌握開發(fā)技能無法準(zhǔn)確實(shí)現(xiàn)自動(dòng)化,不掌握運(yùn)維技能無法正確實(shí)現(xiàn)自動(dòng)化。
?? 轉(zhuǎn)變觀念,讓開發(fā)人員掌握話語權(quán),至少要能自主部署代碼。
?? 可通過CI/CD 流水線實(shí)現(xiàn)。
?? GitOps。
?? 在開發(fā)和運(yùn)維部門之間共享一切(工具、知識(shí)等)。
?? 在設(shè)計(jì)、實(shí)現(xiàn)、部署和自動(dòng)化上持續(xù)協(xié)作,合作是成功的基石。
?? 不能自動(dòng)化執(zhí)行的操作讓人心里不踏實(shí)。
?? 文化:等級(jí)制度< 流程。
?? 多個(gè)微服務(wù)> 巨型單體。
?? 持續(xù)部署系統(tǒng)是軟件團(tuán)隊(duì)的核心和靈魂。
?? 沒有救世主。
?? 持續(xù)交付不是可選項(xiàng),而是必達(dá)的命令。
如何閱讀本書
本書可按任意順序閱讀。隨便翻看一章,你都會(huì)找到對(duì)你的工作有所幫助的內(nèi)容。有經(jīng)驗(yàn)的Python 程序員可以跳過第1 章。如果你對(duì)慘痛經(jīng)驗(yàn)、案例分析和人物訪談感興趣,可以先閱讀最后一章。
內(nèi)容結(jié)構(gòu)
本書內(nèi)容按討論話題的不同分為以下幾部分。
第一部分介紹Python 基礎(chǔ),涵蓋語言基礎(chǔ)知識(shí)、文件和文件系統(tǒng)的自動(dòng)化處理及命令行工具的編寫。
第二部分討論運(yùn)維技術(shù),涵蓋Linux 實(shí)用程序、包管理、構(gòu)建系統(tǒng)、監(jiān)控和監(jiān)測(cè),以及自動(dòng)化測(cè)試。這些是勝任DevOps 工作的必備技能。
第三部分介紹云技術(shù)基礎(chǔ),涉及云計(jì)算、IaC、容器技術(shù)、Kubernetes 和Serverless。
目前,軟件行業(yè)緊缺掌握云技術(shù)的人才。掌握這一部分的知識(shí),你的薪水和事業(yè)都將更上一層樓。
第四部分討論數(shù)據(jù)處理,在DevOps 的背景下介紹機(jī)器學(xué)習(xí)運(yùn)維和數(shù)據(jù)工程。這一部分還有一個(gè)完整的演練項(xiàng)目,你可以使用Flask、Sklearn、Docker 和Kubernetes實(shí)踐機(jī)器學(xué)習(xí)模型的構(gòu)建、部署和落地。
第五部分即最后一章,是DevOps 慘痛經(jīng)驗(yàn)、案例分析、人物訪談。這一章適合睡前閱讀。
Python 基礎(chǔ)
?? 第1 章 Python DevOps 基礎(chǔ)知識(shí)。
?? 第2 章 文件和文件系統(tǒng)自動(dòng)化處理。
?? 第3 章 使用命令行。
運(yùn)維技術(shù)
?? 第4 章 Linux 實(shí)用程序。
?? 第5 章 包管理。
?? 第6 章 持續(xù)集成和持續(xù)部署。
?? 第7 章 監(jiān)控和日志。
?? 第8 章 pytest 在DevOps 中的應(yīng)用。
云技術(shù)基礎(chǔ)
?? 第9 章 云計(jì)算。
?? 第10 章 IaC。
?? 第11 章 容器技術(shù):Docker 和Docker Compose。
?? 第12 章 容器編排:Kubernetes。
?? 第13 章 Serverless 技術(shù)。
數(shù)據(jù)處理
?? 第14 章 MLOps 和機(jī)器學(xué)習(xí)工程。
?? 第15 章 數(shù)據(jù)工程。
案例分析
?? 第16 章 DevOps 慘痛經(jīng)驗(yàn)和人物訪談。
排版約定
本書采用下述排版約定:
斜體(Italic)
表示新術(shù)語、URL、電子郵件地址、文件名和擴(kuò)展名。
等寬字體(Constant Width)
表示程序清單,在段落中出現(xiàn)則表示程序元素,如變量、函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。
粗體等寬字體(Constant Width Bold)
表示命令或其他由用戶直接輸入的文本。
斜體等寬字體(Constant Width Italic)
表示應(yīng)該替換成用戶提供的值,或者由上下文決定的值。
使用代碼示例
本書的補(bǔ)充材料(代碼示例、練習(xí)題,等等)可到https://pythondevops.com 下載。另外,可到Pragmatic AI Labs 的YouTube 頻道(https://oreil.ly/QIYte)中觀看與本書代碼相關(guān)的DevOps 內(nèi)容。
如有技術(shù)疑問想與作者探討,或者在使用代碼示例過程中遇到問題,請(qǐng)發(fā)電子郵件到technical@pythondevops.com。
本書是要幫你完成工作的。一般來說,如果本書提供了示例代碼,你可以把它用在你的程序或文檔中。除非你使用了很大一部分代碼,否則無須聯(lián)系我們獲得許可。例如,用本書的幾個(gè)代碼片段寫一個(gè)程序無須獲得許可,銷售或分發(fā)O’Reilly 圖書的示例光盤則需要獲得許可;引用本書中的示例代碼回答問題無須獲得許可,將書中大量的代碼放到你的產(chǎn)品文檔中則需要獲得許可。
我們很希望但并不強(qiáng)制要求你在引用本書內(nèi)容時(shí)加上引用說明。引用說明一般包括書名、作者、出版社和ISBN。例如:“Python for DevOps by Noah Gift, Kennedy Behrman, Alfredo Deza, and Grig Gheorghiu. (O'Reilly). Copyright 2020 Noah Gift,Kennedy Behrman, Alfredo Deza, Grig Gheorghiu, 978-1-492-05769-7.”。
如果你覺得自己對(duì)示例代碼的用法超出了上述許可的范圍,請(qǐng)通過permissions@oreilly.com 與我們聯(lián)系。
O’Reilly 在線學(xué)習(xí)平臺(tái)(O’Reilly Online Learning)
近40 年來,O’Reilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見解,來幫助眾多公司取得成功。
我們有一群獨(dú)家專家和創(chuàng)新者,他們通過圖書、文章、會(huì)議和在線學(xué)習(xí)平臺(tái)分享知識(shí)和技術(shù)。O’Reilly 的在線學(xué)習(xí)平臺(tái)提供按需訪問的直播培訓(xùn)課程、詳細(xì)的學(xué)習(xí)路徑、交互式編程環(huán)境,以及由O’Reilly 和其他200 多家出版社出版的書籍和視頻。詳情請(qǐng)?jiān)L問http://oreilly.com。
聯(lián)系我們
任何有關(guān)本書的意見或疑問,請(qǐng)按照以下地址聯(lián)系出版社。
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2 號(hào)成銘大廈C 座807 室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
勘誤、示例和其他信息可到oreil.ly/python-for-devops 上獲取。
對(duì)于本書的評(píng)論或技術(shù)性問題,請(qǐng)發(fā)送電子郵件到:bookquestions@oreilly.com
要了解O’Reilly 圖書、培訓(xùn)課程、會(huì)議和新聞的信息,請(qǐng)?jiān)L問以下網(wǎng)站:
http://www.oreilly.com
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
首先,筆者要感謝本書的兩位主要技術(shù)審校。
第一位是Wes Novack,他是一名架構(gòu)師和工程師,擅長公有云系統(tǒng)和Web 級(jí)SaaS應(yīng)用。他負(fù)責(zé)設(shè)計(jì)、構(gòu)建和管理復(fù)雜的系統(tǒng),為托管在AWS 和GCP 上使用不同語言的大型微服務(wù)生態(tài)系統(tǒng)實(shí)現(xiàn)高可用性基礎(chǔ)設(shè)施、持續(xù)交付流水線和快速發(fā)布。Wes 使用不同的語言、框架和工具定義Iac、推動(dòng)自動(dòng)化及減少勞作。他在技術(shù)社區(qū)十分活躍,并積極參與教學(xué)、研討會(huì)和會(huì)議;他還是Pluralsight 視頻教程的講師。Wes 是DevOps 領(lǐng)域文化– 自動(dòng)化– 精益– 度量– 分享(culture, automation, lean,measurement, Sharing,CALMS)模型的倡導(dǎo)者。他的Twitter 賬號(hào)是@WesleyTech,博客地址是https://wesnovack.com。
第二位是Brad Andersen,他是一名軟件工程師和架構(gòu)師,已從事軟件設(shè)計(jì)和開發(fā)30 年。他是變革和創(chuàng)新的引路人,曾在各種企業(yè)組織和初創(chuàng)企業(yè)中擔(dān)任領(lǐng)導(dǎo)職務(wù)和開發(fā)人員。Brad 目前在加利福尼亞大學(xué)伯克利分校攻讀數(shù)據(jù)科學(xué)碩士學(xué)位。Brad 的更多信息見他的LinkedIn 個(gè)人資料。
筆者還要感謝Jeremy Yabrow 和Colin B. Erdman,感謝他們提供的建議和反饋。
Noah
感謝與我合寫本書的Grig、Kennedy 和Alfredo。與如此高效的團(tuán)隊(duì)合作真是讓人心曠神怡。
Kennedy
感謝與我合寫本書的各位,與你們合作特別愉快。感謝家人對(duì)我的耐心和理解。
Alfredo
寫作本書的九年前,即2010 年,我找到了人生第一份軟件工程工作。那一年我31 歲,沒有大學(xué)學(xué)歷,以前也沒有從業(yè)經(jīng)驗(yàn),只能接受底薪,忍受沒有醫(yī)療保險(xiǎn)。我學(xué)到了很多,遇見了許多了不起的人,通過不懈地努力掌握了大量專業(yè)知識(shí)。那些年,如果沒有人給我機(jī)會(huì),沒有人為我指明方向,我不可能有今天的成就。
感謝Chris Benson,他發(fā)現(xiàn)了我對(duì)知識(shí)的渴望,一直為我尋找學(xué)習(xí)的機(jī)會(huì)。
感謝Alejandro Cadavid,他發(fā)現(xiàn)我不辭辛勞,總是愿意做那些別人不愿意做的事。
在我感到心灰意冷,旁人覺得我一無是處時(shí),是您幫我找到了工作。
Carlos Coll 帶領(lǐng)我進(jìn)入編程領(lǐng)域,在我自暴自棄時(shí)也沒有放棄我。學(xué)習(xí)編程改變了我的生活,感謝Carlos 對(duì)我諄諄教導(dǎo),督促我學(xué)習(xí),指導(dǎo)我發(fā)布了人生第一個(gè)程序。
感謝Joni Benton,感謝他對(duì)我的信任,還幫我找到了第一份全職工作。
感謝Jonathan LaCour,他是一位鼓舞人心的老板,一直幫助我提升自我。您的建議珍貴無比。
感謝Noah,我們建立了深厚的友誼,您的指引是我巨大的動(dòng)力源泉。我一直記得我們一起工作的日子,尤其是從頭開始重新構(gòu)建基礎(chǔ)設(shè)施那次。在我還對(duì)Python 一無所知時(shí),您的耐心和指導(dǎo)完全改變了我的生活。
最后,特別感謝我的家人。感謝我的妻子Claudia,她從不懷疑我的學(xué)習(xí)能力和上進(jìn)心,在我筆耕不輟時(shí)毫無怨言。感謝我的孩子們,Efrain、Ignacio 和Alana,我愛你們。
Grig
感謝所有開源軟件的創(chuàng)作人員。沒有他們,我們的工作將充滿崎嶇。同樣感謝所有寫作博文、免費(fèi)分享知識(shí)的人。最后,感謝與我合寫本書的各位,這是一次充滿樂趣的旅程。
Noah Gift是西北大學(xué)和杜克大學(xué)研究生院數(shù)據(jù)科學(xué)專業(yè)與工程項(xiàng)目的講師和顧問。
Kennedy Behrman是一位資深顧問,專門為初創(chuàng)企業(yè)設(shè)計(jì)和實(shí)施云解決方案。
Alfredo Deza是一位軟件工程師和開源軟件開發(fā)者,他重建了公司的基礎(chǔ)設(shè)施。
Grig Gheorghiu是一名程序員、研究實(shí)驗(yàn)室主任、系統(tǒng)/網(wǎng)絡(luò)/安全架構(gòu)師和軟件測(cè)試工程師。
目錄
前言 . 1
第1 章 Python DevOps 基礎(chǔ)知識(shí) 11
1.1 安裝和運(yùn)行Python 12
1.1.1 Python shell 12
1.1.2 Jupyter Notebooks13
1.2 過程式程序設(shè)計(jì) 13
1.2.1 變量 14
1.2.2 基本的數(shù)學(xué)運(yùn)算 15
1.2.3 注釋 15
1.2.4 內(nèi)置函數(shù)16
1.3 執(zhí)行控制 17
1.3.1 if/elif/else .17
1.3.2 for 循環(huán) .18
1.3.3 while 循環(huán) 20
1.4 處理異常 20
1.5 內(nèi)置對(duì)象 21
1.5.1 對(duì)象是什么 .21
1.5.2 對(duì)象的方法和屬性 22
1.5.3 序列 23
1.6 函數(shù) .35
1.6.1 函數(shù)剖析36
1.6.2 函數(shù)是對(duì)象 .37
1.6.3 匿名函數(shù)38
1.7 使用正則表達(dá)式 39
1.7.1 搜索 39
1.7.2 字符集合40
1.7.3 字符類 41
1.7.4 分組 41
1.7.5 具名分組42
1.7.6 查找所有42
1.7.7 查找迭代器 .42
1.7.8 替換 43
1.7.9 編譯 43
1.8 惰性求值 44
1.8.1 生成器 44
1.8.2 生成器推導(dǎo) .45
1.9 更多IPython 功能 .46
1.9.1 在IPython 中運(yùn)行UNIX shell 命令46
1.9.2 使用IPython 的魔法命令 47
1.10 練習(xí)題 .47
第2 章 文件和文件系統(tǒng)自動(dòng)化處理 49
2.1 讀寫文件 49
2.2 使用正則表達(dá)式搜索文本 .59
2.3 處理大型文件 .61
2.4 加密文本 62
2.4.1 哈希和hashlib 63
2.4.2 使用Cryptography 庫加密 63
2.5 os 模塊 65
2.6 使用os.path 管理文件和目錄 .67
2.7 使用os.walk 遍歷目錄樹 70
2.8 使用pathlib 處理路徑對(duì)象 71
第3 章 使用命令行 . 73
3.1 使用shell 73
3.1.1 使用sys 模塊探知系統(tǒng)信息 73
3.1.2 使用os 模塊處理操作系統(tǒng) .74
3.1.3 使用subprocess 模塊派生進(jìn)程 .75
3.2 編寫命令行工具 77
3.2.1 使用sys.argv .79
3.2.2 使用argparse .81
3.2.3 使用click .85
3.2.4 使用fire 90
3.2.5 實(shí)現(xiàn)插件系統(tǒng) 95
3.3 案例分析:使用命令行工具提速Python 96
3.3.1 使用Numba JIT 編譯器 97
3.3.2 通過Python CUDA 使用GPU 99
3.3.3 使用Numba 真正多核多線程運(yùn)行Python 代碼 100
3.3.4 k 均值聚類算法 .101
3.4 練習(xí)題 .103
第4 章 Linux 實(shí)用程序 105
4.1 磁盤實(shí)用程序 106
4.1.1 衡量性能106
4.1.2 分區(qū) .108
4.1.3 獲取特定的設(shè)備信息 109
4.2 網(wǎng)絡(luò)實(shí)用程序 111
4.2.1 SSH 隧道 111
4.2.2 使用Apache Benchmark(ab)評(píng)測(cè)HTTP . 112
4.2.3 使用molotov 做負(fù)載測(cè)試 . 113
4.3 CPU 實(shí)用程序 . 116
4.3.1 CPU 實(shí)用程序簡(jiǎn)介 116
4.3.2 使用htop 查看進(jìn)程 . 116
4.4 使用Bash 和ZSH 118
4.4.1 自定義Python shell . 119
4.4.2 遞歸路徑模式匹配 120
4.4.3 搜索和替換確認(rèn)提示 120
4.4.4 刪除Python 臨時(shí)文件 122
4.4.5 列出和篩選進(jìn)程 122
4.4.6 UNIX 時(shí)間戳 123
4.5 Python 與Bash 和ZSH 混合使用 124
4.5.1 隨機(jī)密碼生成器 124
4.5.2 這個(gè)模塊是否存在 125
4.5.3 進(jìn)入模塊所在的目錄 125
4.5.4 把CSV 文件轉(zhuǎn)換成JSON 文件 .126
4.6 Python 單行程序 .127
4.6.1 調(diào)試器 127
4.6.2 這段代碼的運(yùn)行速度有多快 128
4.7 strace .129
4.8 練習(xí)題 .131
4.9 實(shí)操題 .132
第5 章 包管理 133
5.1 打包簡(jiǎn)介 .134
5.1.1 打包的重要性 .134
5.1.2 何時(shí)不需要打包 134
5.2 打包準(zhǔn)則 .135
5.2.1 恰當(dāng)?shù)陌姹咎?hào) .135
5.2.2 更改日志136
5.3 選擇一種策略 137
5.4 打包方案 .138
5.4.1 Python 原生包 138
5.4.2 Debian 包 145
5.4.3 RPM 包 153
5.5 使用systemd 管理服務(wù) 160
5.5.1 長時(shí)間運(yùn)行的進(jìn)程 161
5.5.2 創(chuàng)建項(xiàng)目161
5.5.3 systemd 單元文件 .163
5.5.4 安裝單元164
5.5.5 處理日志166
5.6 練習(xí)題 .167
5.7 實(shí)操題 .168
第6 章 持續(xù)集成和持續(xù)部署 . 169
6.1 真實(shí)案例分析:把維護(hù)不善的WordPress 網(wǎng)站轉(zhuǎn)換成Hugo 169
6.1.1 設(shè)置Hugo .171
6.1.2 把WordPress 文章轉(zhuǎn)換成Hugo 文章 .172
6.1.3 創(chuàng)建并更新Algolia 索引 174
6.1.4 使用Makefile 編排流程 176
6.1.5 使用AWS CodePipeline 部署 .176
6.2 真實(shí)案例分析:使用Google Cloud Build 把Python 應(yīng)用部署到
Google App Engine 中 178
6.3 真實(shí)案例分析:NFSOPS 185
第7 章 監(jiān)控和日志 187
7.1 構(gòu)建可靠系統(tǒng)的關(guān)鍵概念 187
7.2 不可變的DevOps 原則 188
7.2.1 集中處理日志 .188
7.2.2 案例分析:生產(chǎn)數(shù)據(jù)庫塞滿硬盤 .189
7.2.3 自建還是購買? 190
7.2.4 容錯(cuò) .190
7.3 監(jiān)控 192
7.3.1 Graphite .192
7.3.2 StatsD .192
7.3.3 Prometheus 193
7.4 監(jiān)測(cè)程序 .197
7.4.1 監(jiān)測(cè)程序概述 .197
7.4.2 命名約定200
7.5 日志 201
7.5.1 為什么很難 202
7.5.2 basicconfig 202
7.5.3 深度配置203
7.5.4 常用模式208
7.6 ELK 棧 .209
7.6.1 Logstash .210
7.6.2 Elasticsearch 和Kibana .212
7.7 練習(xí)題 .215
7.8 實(shí)操題 .216
第8 章 pytest 在DevOps 中的應(yīng)用 217
8.1 測(cè)試小鋼炮pytest 217
8.2 pytest 入門 .218
8.2.1 使用pytest 測(cè)試 218
8.2.2 與unittest 的區(qū)別 .220
8.3 pytest 特性 .222
8.3.1 conftest.py 223
8.3.2 出色的assert223
8.3.3 參數(shù)化 225
8.4 固件 226
8.4.1 入門 .227
8.4.2 內(nèi)置固件229
8.5 基礎(chǔ)設(shè)施測(cè)試 231
8.5.1 什么是系統(tǒng)驗(yàn)證 232
8.5.2 Testinfra 簡(jiǎn)介 .233
8.5.3 連接遠(yuǎn)程節(jié)點(diǎn) .233
8.5.4 特性和特殊固件 237
8.5.5 案例 .238
8.6 使用pytest 測(cè)試Jupyter Notebooks 241
8.7 練習(xí)題 .242
8.8 實(shí)操題 .242
第9 章 云計(jì)算 243
9.1 云計(jì)算基礎(chǔ)知識(shí) .244
9.2 云計(jì)算的類型 246
9.3 云服務(wù)的類型 246
9.3.1 IaaS 247
9.3.2 MaaS 251
9.3.3 PaaS .251
9.3.4 Serverless 252
9.3.5 SaaS .255
9.4 IaC .256
9.5 持續(xù)交付 .256
9.6 虛擬化和容器 256
9.6.1 硬件虛擬化 256
9.6.2 SDN .257
9.6.3 SDS .257
9.6.4 容器 .257
9.7 分布式計(jì)算面臨的挑戰(zhàn)和機(jī)遇 258
9.8 云時(shí)代Python 的并發(fā)、性能和進(jìn)程管理 260
9.9 進(jìn)程管理 .261
9.9.1 使用subprocess 管理進(jìn)程 261
9.9.2 使用multiprocessing 庫解決問題 .263
9.9.3 使用Pool() 派生進(jìn)程 264
9.9.4 FaaS 和Serverless 267
9.9.5 使用Numba 提升Python 的性能 267
9.9.6 使用Numba JIT 編譯器 .267
9.9.7 使用高性能服務(wù)器 268
9.10 小結(jié) 269
9.11 練習(xí)題 269
9.12 實(shí)操題 270
第10 章 IaC 271
10.1 基礎(chǔ)設(shè)施自動(dòng)化工具分類 272
10.2 手動(dòng)配置 274
10.3 使用Terraform 自動(dòng)配置基礎(chǔ)設(shè)施 .275
10.3.1 配置S3 bucket .276
10.3.2 使用ACM 配置SSL 證書 .279
10.3.3 配置Amazon CloudFront 分配 280
10.3.4 配置Route 53 DNS 記錄 283
10.3.5 把靜態(tài)文件復(fù)制到S3 中 284
10.3.6 刪除使用Terraform 配置的所有AWS 資源 .285
10.4 使用Pulumi 自動(dòng)配置基礎(chǔ)設(shè)施285
10.4.1 為AWS 新建一個(gè)Pulumi Python 項(xiàng)目 286
10.4.2 為過渡堆棧創(chuàng)建配置值 291
10.4.3 配置一個(gè)ACM SSL 證書 291
10.4.4 配置Route 53 區(qū)域和DNS 記錄 292
10.4.5 配置一個(gè)CloudFront 分配 .295
10.4.6 為網(wǎng)站的URL 配置一個(gè)Route 53 DNS 記錄 296
10.4.7 創(chuàng)建并部署一個(gè)新堆棧 297
10.5 練習(xí)題 300
第11 章 容器技術(shù):Docker 和Docker Compose 301
11.1 Docker 容器是什么 .302
11.2 創(chuàng)建、構(gòu)建、運(yùn)行及刪除Docker 映像和容器 .302
11.3 把Docker 映像發(fā)布到Docker 注冊(cè)處中 .306
11.4 使用相同的映像在不同的宿主機(jī)中運(yùn)行Docker 容器 308
11.5 使用Docker Compose 運(yùn)行多個(gè)Docker 容器 310
11.6 把Docker Compose 運(yùn)行的服務(wù)移植到新主機(jī)和操作系統(tǒng)中 323
11.7 練習(xí)題 327
第12 章 容器編排:Kubernetes . 329
12.1 Kubernetes 相關(guān)概念簡(jiǎn)述 330
12.2 使用Kompose 根據(jù)docker-compose.yaml 創(chuàng)建Kubernetes 清單 331
12.3 使用minikube 把Kubernetes 清單部署到本地Kubernetes 集群 .333
12.4 在GCP 中使用Pulumi 創(chuàng)建GKE Kubernetes 集群 349
12.5 把Flask 示例應(yīng)用部署到GKE 中 352
12.6 安裝Helm chart Prometheus 和Grafana 359
12.7 銷毀GKE 集群 .364
12.8 練習(xí)題 365
第13 章 Serverless 技術(shù) 367
13.1 把同一個(gè)Python 函數(shù)部署到三大云服務(wù)商中 .370
13.1.1 安裝Serverless 框架 .370
13.1.2 把Python 函數(shù)部署到AWS Lambda 中 .370
13.1.3 把Python 函數(shù)部署到Google Cloud Functions 中 373
13.1.4 把Python 函數(shù)部署到Azure 中 380
13.2 把Python 函數(shù)部署到自托管的FaaS 平臺(tái)中 384
13.2.1 把Python 函數(shù)部署到自托管的PaaS 平臺(tái)的優(yōu)勢(shì) 384
13.2.2 把Python 函數(shù)部署到OpenFaaS 中 .385
13.3 使用AWS CDK 配置DynamoDB 數(shù)據(jù)表、Lambda 函數(shù)和
API 網(wǎng)關(guān)方法 .393
13.4 練習(xí)題 415
第14 章 MLOps 和機(jī)器學(xué)習(xí)工程 417
14.1 機(jī)器學(xué)習(xí)是什么 417
14.1.1 監(jiān)督型機(jī)器學(xué)習(xí) .417
14.1.2 建模 420
14.2 Python 機(jī)器學(xué)習(xí)生態(tài)環(huán)境 423
14.2.1 Python 機(jī)器學(xué)習(xí)框架和生態(tài)系統(tǒng) 423
14.2.2 PyTorch 深度學(xué)習(xí) 424
14.3 機(jī)器學(xué)習(xí)云平臺(tái) 428
14.4 機(jī)器學(xué)習(xí)成熟模型 429
14.4.1 機(jī)器學(xué)習(xí)重點(diǎn)術(shù)語 .429
14.4.2 第1 層:?jiǎn)栴}構(gòu)建、范圍界定和問題定義 430
14.4.3 第2 層:持續(xù)交付數(shù)據(jù) 431
14.4.4 第3 層:持續(xù)交付凈化數(shù)據(jù) .432
14.4.5 第4 層:持續(xù)交付探索性數(shù)據(jù)分析 434
14.4.6 第5 層:持續(xù)交付傳統(tǒng)機(jī)器學(xué)習(xí)和AutoML 434
14.4.7 第6 層:機(jī)器學(xué)習(xí)運(yùn)作反饋環(huán) 435
14.5 使用Docker 和Kubernetes 部署sklearn Flask 應(yīng)用 435
14.5.1 EDA 440
14.5.2 建模 441
14.5.3 調(diào)整GBM 縮放 442
14.5.4 擬合模型 .443
14.5.5 評(píng)估 444
14.5.6 adhoc_predict 445
14.5.7 JSON 工作流 446
14.5.8 縮放輸入 .446
14.5.9 adhoc_predict 447
14.5.10 縮放輸入 448
14.6 練習(xí)題 448
14.7 實(shí)操題 449
14.8 學(xué)習(xí)評(píng)價(jià) 449
第15 章 數(shù)據(jù)工程 . 451
15.1 小數(shù)據(jù) 452
15.1.1 小數(shù)據(jù)與大數(shù)據(jù) .452
15.1.2 處理小數(shù)據(jù)文件 .452
15.2 寫文件 453
15.3 讀文件 453
15.4 使用生成器流水線逐行讀取和處理 453
15.5 使用YAML .454
15.6 大數(shù)據(jù) 455
15.7 大數(shù)據(jù)工具、組件和平臺(tái) 457
15.7.1 數(shù)據(jù)源 .458
15.7.2 文件系統(tǒng) .458
15.7.3 數(shù)據(jù)存儲(chǔ) .459
15.7.4 實(shí)時(shí)流式采集 460
15.8 案例分析:自制數(shù)據(jù)流水線 461
15.9 Serverless 數(shù)據(jù)工程 462
15.9.1 使用AWS Lambda 處理CloudWatch 事件 463
15.9.2 使用Amazon CloudWatch 日志分析AWS Lambda 463
15.9.3 使用AWS Lambda 填充Amazon Simple Queue Service .464
15.9.4 連接CloudWatch 事件觸發(fā)器 468
15.9.5 創(chuàng)建事件驅(qū)動(dòng)型lambda .469
15.9.6 從AWS Lambda 中讀取Amazon SQS 事件 .470
15.10 小結(jié) .474
15.11 練習(xí)題 .475
15.12 實(shí)操題 .475
第16 章 DevOps 慘痛經(jīng)驗(yàn)和人物訪談 . 477
16.1 產(chǎn)不出電影的電影廠 .478
16.2 推不出游戲的游戲坊 .480
16.3 耗時(shí)60 秒才啟動(dòng)的Python 腳本 .482
16.4 用緩存和智能監(jiān)測(cè)程序澆滅火情 483
16.5 自動(dòng)化會(huì)讓你失業(yè) 484
16.6 DevOps 反模式 .485
16.6.1 反模式:沒有自動(dòng)化構(gòu)建服務(wù)器 485
16.6.2 盲目行事 .486
16.6.3 協(xié)調(diào)難題不可避免 .486
16.6.4 沒有團(tuán)隊(duì)合作 487
16.7 人物訪談 492
16.7.1 Glenn Solomon 492
16.7.2 Andrew Nguyen 493
16.7.3 Gabriella Roman .495
16.7.4 Rigoberto Roche .496
16.7.5 Jonathan LaCour .498
16.7.6 Ville Tuulos 500
16.7.7 Joseph Reis 502
16.7.8 Teijo Holzer 503
16.7.9 Matt Harrison 505
16.7.10 Michael Foord 507
16.8 一些建議 510
16.9 練習(xí)題 511
16.10 挑戰(zhàn)題 . 511
16.11 畢業(yè)項(xiàng)目 511