基礎(chǔ)架構(gòu)即代碼的8大優(yōu)勢,以及如何選擇工具?
越來越多的企業(yè)將主要應用或服務托管在云平臺上,也使得基礎(chǔ)架構(gòu)即代碼(IaC)變得越來越流行。
為什么需要基礎(chǔ)架構(gòu)作為代碼?
在傳統(tǒng)基礎(chǔ)設(shè)施上,當你需要一臺服務器資源,則需要運維團隊去創(chuàng)建一個虛擬機實例或為應用準備物理服務器,配置中需要使用到腳本或手動安裝的方式。
當有了更多應用需求,則需要更多的虛擬機,用于DNS,郵件服務器,數(shù)據(jù)庫等等。還有要對操作系統(tǒng),Web服務器,JVM和其他所有相關(guān)架構(gòu)進行持續(xù)的更新。而且隨著時間的發(fā)展,它們彼此之間的配置會發(fā)生變化,帶來配置的漂移,從而產(chǎn)生了雪花服務器(snowflake servers)。跟蹤配置更改是很大的挑戰(zhàn)。
如果服務器很少且使用周期較長,那么還可以接受。
隨著AWS等公有云服務的廣泛使用,企業(yè)對計算資源的選擇發(fā)生了很大變化。許多企業(yè)沒有了在硬件和數(shù)據(jù)中心上的投資,而是開始將其應用程序遷移到云中。在云端,可以在數(shù)分鐘內(nèi)部署服務器。
為了保持最佳性能和可用性,可能必須部署更多實例來滿足需求。然后,不需要時對資源彈性釋放來節(jié)省成本。當按小時付費時,可能需要每天按比例彈性的縮放,所以如果每天多次手動進行操作,顯然具有挑戰(zhàn)性。
通過自動化的方式,獲取代碼中部署或終止實例,以及其他基礎(chǔ)結(jié)構(gòu)組件所需的配置步驟,云可以幫助更快,更可靠地交付價值。
什么是基礎(chǔ)架構(gòu)即代碼?
所以,基礎(chǔ)設(shè)施即代碼是使用軟件開發(fā)原則和實踐的基礎(chǔ)設(shè)施自動化。
簡單理解,就是基礎(chǔ)架構(gòu)像軟件一樣來對待,然后編寫,測試和執(zhí)行代碼以定義,部署,更新和釋放基礎(chǔ)架構(gòu)。通過編寫代碼來管理服務器,數(shù)據(jù)庫,網(wǎng)絡(luò),日志,應用程序的部署和配置。當要更改基礎(chǔ)結(jié)構(gòu)時,可以更改代碼,對其進行測試,然后將其應用于系統(tǒng)中。

基礎(chǔ)架構(gòu)即代碼與手動配置相比,優(yōu)勢顯而易見:
1. 自助服務
由于將基礎(chǔ)架構(gòu)定義為代碼,因此整個過程和部署可以自動化,并且可以由DevOps團隊中的任何人啟動,有基礎(chǔ)架構(gòu)需求的用戶可以在需要時獲得所需的資源。
2. 冪等性
冪等性意味著你定義了所需的狀態(tài),并且無論運行腳本多少次,結(jié)果都是相同的。它檢查當前狀態(tài)和所需狀態(tài),并僅應用所需的更改。而使用bash腳本很難做到這一點。
Ansible和Terraform之類的工具具有內(nèi)置功能,可以使代碼具有冪等性。
3. 降低成本
與手動配置相比,降低了配置所需的時間和精力。
4. 更快的軟件交付
快速為開發(fā),測試和生產(chǎn)配置基礎(chǔ)架構(gòu),使企業(yè)能夠更快地交付軟件。由于部署過程是自動化的,因此它也是一致且可重復的。
5. 自我記錄
基礎(chǔ)結(jié)構(gòu)的狀態(tài)由任何人都易于閱讀的代碼來定義。
6. 版本控制
傳統(tǒng)上,更改生產(chǎn)系統(tǒng)被認為是有風險的,但往往改變不可避免。但添加新功能時,可能需要添加新數(shù)據(jù)庫,可能需要向集群添加新服務器或存儲。基礎(chǔ)架構(gòu)即代碼減少了對基礎(chǔ)架構(gòu)進行更改的工作量和風險。
可以在版本控制中載入源文件,這意味著你可以跟蹤對基礎(chǔ)結(jié)構(gòu)所做的所有更改,并在出現(xiàn)問題時快速恢復到以前的版本。
7. 驗證與測試
基礎(chǔ)架構(gòu)即代碼可以連續(xù)測試和應用小的更改。一切都是代碼,因此可以使用靜態(tài)分析和自動化測試來檢查錯誤。
8. 提升安全性
向基礎(chǔ)架構(gòu)即代碼的轉(zhuǎn)變能夠從一開始就嵌入安全性,然后就可以可靠,安全地應用更改。
基礎(chǔ)架構(gòu)即代碼的工具
盡管有許多工具可用,但選擇一種工具可能并不容易。以下是一些注意事項,可能對大家?guī)椭;A(chǔ)架構(gòu)即代碼的工具大致上可分為兩類:配置管理工具和配置工具。
配置管理工具是用戶管理在現(xiàn)有服務器上安裝和管理的工具。比如,Chef,Puppet,Ansible和SaltStack都是主要的配置管理工具。可以使用配置管理工具在服務器上安裝和更新軟件。

Terraform,CloudFormation,OpenStack Heat是配置工具,即用于創(chuàng)建服務器,數(shù)據(jù)庫服務器,負載均衡,隊列,子網(wǎng),防火墻以及基礎(chǔ)架構(gòu)的所有其他組件。這些工具對提供程序進行API調(diào)用以創(chuàng)建所需的基礎(chǔ)結(jié)構(gòu)。

1. 可變與不可變基礎(chǔ)架構(gòu)
可變基礎(chǔ)架構(gòu)是一種在配置后即可修改的基礎(chǔ)架構(gòu)。Chef,Ansible,Puppet和SaltStack能夠在現(xiàn)有服務器上安裝或更新軟件。在服務器的生命周期中,這可能會發(fā)生很多次。經(jīng)過多次更新后,每臺服務器可能與其他服務器略有不同,從而導致配置漂移。例如,某些在測試服務器上正常運行的更改,可能無法在生產(chǎn)服務器上運行。
Terraform和CloudFormation之類的工具能夠每次通過計算機鏡像或容器鏡像創(chuàng)建新服務器。如果需要更新服務器,就用用新服務器替換它們。新服務器啟動后,可以終止舊服務器。每個部署都使用不可變的鏡像來創(chuàng)建服務器,因此避免了配置漂移。不過,效率可能有點慢。
2. 命令式與聲明式工具
命令式工具類似于腳本,列出了達到所需狀態(tài)所要采取的步驟。聲明性工具可以指定結(jié)束狀態(tài),并且工具將制定實現(xiàn)該狀態(tài)的步驟。
Chef是主要的命令式工具,而Ansible使用混合方法并支持命令式和聲明式技術(shù)。
Terraform,CloudFormation,Puppet,OpenStack Heat和SaltStack都屬于聲明性工具類別,可以在其中聲明所需的最終狀態(tài)。
3. 使用多種工具
盡管這些工具中的每一個都可以單獨使用,但是一種通用的方法是將它們一起使用。例如,可以使用Terraform來構(gòu)建VPC,子網(wǎng),網(wǎng)關(guān),負載均衡和虛擬機,然后使用Ansible在這些實例上配置和部署服務。