探討基礎(chǔ)設(shè)施即代碼所帶來的挑戰(zhàn)

image.png

原文地址:https://lukeshaughnessy.medium.com/infrastructure-as-code-is-not-the-answer-cfaf4882dcba

以下是譯文

當(dāng)然检痰,你聽過銷售宣傳。如果你在 DevOps、平臺或 SRE 領(lǐng)域工作,那么你可能已經(jīng)自己推銷過它获茬「绍裕基礎(chǔ)設(shè)施即代碼(Infrastructure as Code)!其好處多種多樣且不言自明:

  • 它是可復(fù)制的碴萧!
  • 它是自文檔化的棵譬!
  • 它是可見的显蝌!
  • 它可以防止錯誤發(fā)生!
  • 它能降低成本订咸!
  • 它可以防止偏移(drift)發(fā)生曼尊!
  • 它可以避免重復(fù)勞動,增加工作樂趣脏嚷!
  • 自助服務(wù)骆撇!

毫無疑問,所有這些事情都可能是真的可以實(shí)現(xiàn)的父叙。在理想的世界里神郊,所有這些好處都將顯而易見肴裙,并且對于愿意投入前期資金將基礎(chǔ)設(shè)施部署轉(zhuǎn)換為代碼和配置管理的任何組織都將大有裨益。而我們大多數(shù)人也確實(shí)如此涌乳。但是蜻懦,那些不在理想世界中的事情呢?采用 IAC 存在哪些實(shí)際成本夕晓、風(fēng)險(xiǎn)和困難宛乃?在現(xiàn)實(shí)的光芒下,華麗銷售宣傳在哪里開始融化了呢蒸辆?讓我們看一下上面提到的一些優(yōu)點(diǎn)征炼,并檢查其中的一些假設(shè)。

它是可復(fù)制的躬贡!

嗯谆奥,有點(diǎn)道理。我會說基礎(chǔ)設(shè)施代碼在一段時(shí)間內(nèi)是非扯阂耍可復(fù)制的 —— 但是隨后...事情變得不穩(wěn)定了。軟件包過時(shí)了空骚。功能被棄用并停止工作纺讲。代碼語法發(fā)生了變化。鏡像不再可用囤屹。Dockerhub 要你付費(fèi)熬甚。某些用戶賬戶已經(jīng)建立,而他們已經(jīng)不再在這里工作了肋坚。許多相互依存的依賴關(guān)系使得部署正常運(yùn)行乡括,但它們隨時(shí)間改變。重點(diǎn)是部署代碼具有一定的壽命智厌,如果你不不斷地更新它诲泌,當(dāng)你突然需要它時(shí),它將不起作用铣鹏。

譯注:意思是雖然基礎(chǔ)設(shè)施的代碼是被版本化的敷扫,是穩(wěn)定的。但是它所依賴的東西卻可能是不穩(wěn)定的诚卸。

它是自文檔化的葵第!

同樣,有點(diǎn)道理合溺。然而卒密,這個論點(diǎn)有幾個缺陷。第一個問題與上面提到的問題有關(guān)棠赛。你的代碼在一段時(shí)間后開始變得陳舊不堪哮奇。這意味著膛腐,第一次查看你的代碼的工程師可能會開始追尋兔子洞,試圖使一些舊模塊在新的云環(huán)境中運(yùn)行屏镊,在那里許多關(guān)于如何完成任務(wù)的假設(shè)已經(jīng)不再適用依疼。我有同事花了數(shù)天時(shí)間來追查失敗的部署,并一步步調(diào)試而芥,因?yàn)樗麄冊诖a中看到的內(nèi)容與現(xiàn)實(shí)不符而感到完全困惑律罢。事實(shí)上,如果他們重新開始編寫新代碼棍丐,可能會更快误辑、更好。

譯注:是代碼就會有代碼質(zhì)量問題歌逢。作者所言的問是他使用的老模板的依賴發(fā)生了變化巾钉,導(dǎo)致老模板的失敗。

第二個問題是秘案,我認(rèn)為代碼真的不適合作為文檔砰苍。我自己寫過代碼,六個月后回來看阱高,我完全想不起我當(dāng)時(shí)做了什么赚导。在編寫代碼時(shí),你可能會使用各種各樣的技巧赤惊、半成品和明顯錯誤的東西吼旧,因?yàn)楹芸赡茉谧龅臅r(shí)候還在學(xué)習(xí)相關(guān)知識∥粗郏回頭再看這些代碼時(shí)圈暗,你會發(fā)現(xiàn)其中存在許多混亂和難以理解的部分≡0颍基礎(chǔ)設(shè)施代碼同樣存在這些問題员串,它可能會包含各種不穩(wěn)定的假設(shè)和方法。這些假設(shè)和方法可能會使其他工程師在查看時(shí)感到困惑或無法理解昼扛。

譯注:只要是代碼昵济,都會遇到同樣的問題。作者說的是代碼的可讀性問題野揪。

它是可見的访忿!

是的,它是可見的 —— 就像我在 CTO 的辦公室角落用西里爾字母噴涂標(biāo)語一樣斯稳。這會很酷也很叛逆海铆,但沒有人知道它說了什么。問題在于代碼挣惰,嗯卧斟,是 代碼殴边。這不是非工程師可以輕易閱讀的內(nèi)容,甚至對于不熟悉 Terraform 或其他技術(shù)的工程師來說也不容易閱讀珍语。理解其中的信息需要實(shí)踐和培訓(xùn)锤岸,有時(shí)即使經(jīng)驗(yàn)豐富的工程師也需要一些時(shí)間才能完全弄清楚所有信息的位置,特別是如果你有很多嵌套文件板乙、依賴項(xiàng)和調(diào)用腳本的腳本是偷。重點(diǎn)是,是的募逞,你可以看到它蛋铆,但這并不意味著你可以迅速或輕松地理解它。

譯注:其實(shí)放接,這并不是什么問題刺啦,我們可以想辦法根據(jù)代碼生成基礎(chǔ)設(shè)施的圖。

它可以防止錯誤發(fā)生纠脾!

或者玛瘸,它可以像氫彈核心周圍的重氫外套一樣放大它們。我曾經(jīng)聽過一個故事苟蹈,說有個工程師在他的筆記本電腦上運(yùn)行了“terraform destroy”命令——但是在錯誤的標(biāo)簽頁上糊渊。他處于“Prod”目錄下,并開始對生產(chǎn)環(huán)境進(jìn)行摧毀汉操。意識到自己的錯誤后再来,他按下了Control-C退出了命令蒙兰,但為時(shí)已晚磷瘤。很多東西已經(jīng)消失了,除此之外搜变,終止進(jìn)程也讓狀態(tài)文件處于混亂狀態(tài)采缚。他們通過手動修復(fù)狀態(tài)文件并重新運(yùn)行terraform來恢復(fù)了它,并在幾個小時(shí)內(nèi)解決了這個問題挠他。但這是一個非常容易犯的錯誤扳抽,任何人都可能會犯。

譯注:作者說的案例是流程上問題殖侵。即使不使用基礎(chǔ)設(shè)施即代碼也會發(fā)生同樣的問題贸呢。但是這個問題從側(cè)面說明的是基礎(chǔ)設(shè)施即代碼需要配上一定的操作流程。

它能降低成本拢军!

如果一切都完美地運(yùn)作楞陷,從不發(fā)生變化,而且您一直做同樣的事情茉唉,那當(dāng)然可以固蛾。但根據(jù)我的經(jīng)驗(yàn)结执,保持代碼更新需要花費(fèi)工程師大量時(shí)間和精力。工程師每天需要花費(fèi)數(shù)小時(shí)進(jìn)行調(diào)試艾凯、故障排除献幔、學(xué)習(xí)和編寫代碼。如果你只是登錄控制臺并點(diǎn)擊一些框趾诗,可能只需要幾分鐘就能完成的任務(wù)蜡感,可能需要數(shù)天的工作才能自動化完成。如果您經(jīng)常使用自己的代碼沧竟,那么它值得投資铸敏。但您需要認(rèn)真考慮自己有多少次實(shí)際上會部署新的RDS實(shí)例或新的Cloudfront分發(fā)?其中許多任務(wù)只需完成一次悟泵,您可能永遠(yuǎn)不會再做了杈笔。你真的需要花費(fèi)數(shù)天時(shí)間來自動化這個過程嗎?

譯注:作者說的是基礎(chǔ)設(shè)施的規(guī)模問題糕非。也就是我們在實(shí)踐基礎(chǔ)設(shè)施即代碼時(shí)蒙具,需要考慮基礎(chǔ)設(shè)施的規(guī)模。

它可以防止偏移(drift)發(fā)生朽肥!

只有當(dāng)您創(chuàng)建代碼以更改環(huán)境中的內(nèi)容時(shí)禁筏,這才是正確的。一旦一個人擁有控制臺的訪問權(quán)限衡招,你就可能會遇到“漂移”問題篱昔。那么這個神經(jīng)病般的罪犯是誰,在控制臺上不斷進(jìn)行變更呢始腾?嗯州刽,有時(shí)候就是你自己。因?yàn)槌霈F(xiàn)了故障浪箭,你需要在負(fù)載均衡器中添加新的證書穗椅,或者因?yàn)槟阏谑艿紻DOS攻擊,需要添加CloudFront分發(fā)來吸收傳入請求奶栖∑ケ恚或者因?yàn)槟阈枰獙⒛承〇|西進(jìn)行規(guī)模擴(kuò)展以處理意外負(fù)載。現(xiàn)在顯然宣鄙,你可以事后回過頭來重新編寫你的代碼袍镀,以反映你所做的更改。這看起來很愚蠢冻晤,但在我的經(jīng)驗(yàn)中苇羡,這種情況在現(xiàn)實(shí)世界中經(jīng)常發(fā)生。

譯注:作者說的基礎(chǔ)設(shè)施即代碼中經(jīng)常遇到的問題:界面操作先于代碼操作明也。這種情況在實(shí)際情況會有發(fā)生宣虾,但是要看頻繁程度和規(guī)模惯裕。如果經(jīng)常發(fā)生,且界面上進(jìn)行大量的操作绣硝,那么蜻势,這其實(shí)需要在流程上控制,且說明之前的基礎(chǔ)設(shè)施的設(shè)計(jì)就存在問題鹉胖。

它可以避免重復(fù)勞動握玛,增加工作樂趣!

你想處理一些瑣碎乏味的任務(wù)嗎甫菠?比如將Terraform 0.10版本升級到1.3版本挠铲?這個過程中有相當(dāng)多的語法變化,盡管一些自動化工具可以幫助處理寂诱。但是舊版本的Terraform需要很多奇怪的解決方法拂苹,而這些問題在新版本中已得到改進(jìn)并增加了新功能。因此痰洒,僅僅使用自動化工具來重新處理語法是不夠的瓢棒,你需要全面重構(gòu)整個代碼庫。我有同事已經(jīng)進(jìn)行了一年以上的Terraform遷移工作丘喻。這是一個需要投入許多工程師小時(shí)數(shù)才能更新的巨大工作脯宿。有時(shí)候很難說服老板這么做,特別是如果你已經(jīng)消耗了所有的好感度以及花費(fèi)幾個月時(shí)間創(chuàng)建代碼泉粉。

譯注:這段文本談到了如何將Terraform代碼庫從0.10版本升級到1.3版本连霉,需要進(jìn)行全面重構(gòu)和大量工程師時(shí)間的投入。此外嗡靡,這也涉及到舊版本的一些語法變化和解決方案跺撼,而新版本已經(jīng)增加了新功能和改進(jìn)。這種更新過程可能會被認(rèn)為是瑣碎乏味的任務(wù)叽躯,但它是必要的财边,因?yàn)樗梢蕴岣叽a質(zhì)量和可維護(hù)性肌括。然而点骑,向老板證明這種更新的必要性有時(shí)可能很難,尤其是當(dāng)團(tuán)隊(duì)已經(jīng)花費(fèi)了大量時(shí)間創(chuàng)建代碼并消耗了所有好感度時(shí)谍夭。

自助服務(wù)黑滴!

平臺團(tuán)隊(duì)的終極目標(biāo)是為整個公司打造一個自助PAAS(平臺即服務(wù))系統(tǒng)。所有基礎(chǔ)設(shè)施和服務(wù)都經(jīng)過了徹底的自動化紧索,以至于非DevOps工程師可以拉取git存儲庫袁辈,編輯一些模板文件,然后將其推回珠漂,并且你的CI/CD系統(tǒng)會自動部署它們晚缩。所有的日志記錄尾膊、警報(bào)、指標(biāo)和安全策略都已經(jīng)內(nèi)置荞彼。我真的很喜歡這個想法冈敛,我正在努力讓我的當(dāng)前公司達(dá)到這個狀態(tài)。但這又與現(xiàn)實(shí)相沖突鸣皂。例如抓谴,我們曾經(jīng)有一個非常復(fù)雜的自動化系統(tǒng)來管理Github中的用戶賬戶。我們會編輯文件寞缝,將它們推送到CI中癌压,然后用戶和repo就會被填充。然而荆陆,我們意識到這是不必要的復(fù)雜性滩届,顯著減緩了新員工的入職進(jìn)度,因?yàn)樗麄冃枰却夹g(shù)人員編輯自動化文件被啼。直接確保團(tuán)隊(duì)經(jīng)理經(jīng)過審核并接受了安全策略的培訓(xùn)并獲得直接訪問Github丐吓,比起使用自動化管理用戶賬戶更容易快速。我們相信他們會正確地點(diǎn)擊來添加新賬戶并授予權(quán)限趟据。

譯注:作者舉了一個Github用戶授權(quán)管理的例子券犁,想說明的是并不是基礎(chǔ)設(shè)施并不一定要所有都通過“Code”來實(shí)現(xiàn),有時(shí)通過界面點(diǎn)點(diǎn)可能效率更高汹碱。

總結(jié)

這是否意味著我們放棄IAC的整個想法而重新回到在控制臺上點(diǎn)擊操作呢粘衬?當(dāng)然不是。我認(rèn)為這是最好的答案咳促。就像過去的好主意一樣——比如敏捷開發(fā)稚新、Scrum、DevOps跪腹、無服務(wù)器計(jì)算褂删、微服務(wù)——它們都可以帶來很大的價(jià)值。你不能固執(zhí)地認(rèn)為你必須全身心地致力于這個想法冲茸。IAC有其使用場景屯阀,但僅僅是一個使用場景而已。并非每種情況都相同轴术,總存在一些魔鬼般的細(xì)節(jié)需要應(yīng)對难衰。一個好的工程師或工程經(jīng)理會知道何時(shí)該放棄自動化完美的柏拉圖式理念,允許人們在必要時(shí)靈活一些逗栽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盖袭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳄虱,老刑警劉巖弟塞,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拙已,居然都是意外死亡宣肚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門悠栓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霉涨,“玉大人,你說我怎么就攤上這事惭适◇仙” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵癞志,是天一觀的道長往枷。 經(jīng)常有香客問我,道長凄杯,這世上最難降的妖魔是什么错洁? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮戒突,結(jié)果婚禮上屯碴,老公的妹妹穿的比我還像新娘。我一直安慰自己膊存,他們只是感情好导而,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隔崎,像睡著了一般今艺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爵卒,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天虚缎,我揣著相機(jī)與錄音,去河邊找鬼钓株。 笑死实牡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的享幽。 我是一名探鬼主播铲掐,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拾弃,長吁一口氣:“原來是場噩夢啊……” “哼值桩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起豪椿,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奔坟,失蹤者是張志新(化名)和其女友劉穎携栋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咳秉,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婉支,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澜建。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片向挖。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炕舵,靈堂內(nèi)的尸體忽然破棺而出何之,到底是詐尸還是另有隱情,我是刑警寧澤咽筋,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布溶推,位于F島的核電站,受9級特大地震影響奸攻,放射性物質(zhì)發(fā)生泄漏蒜危。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一睹耐、第九天 我趴在偏房一處隱蔽的房頂上張望辐赞。 院中可真熱鬧,春花似錦硝训、人聲如沸占拍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晃酒。三九已至,卻和暖如春窄绒,著一層夾襖步出監(jiān)牢的瞬間贝次,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工彰导, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛔翅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓位谋,卻偏偏與公主長得像山析,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掏父,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容