對于運維來說,管理IT基礎設施是一項艱巨的體力勞動,從最原始的用Excel記錄維護配置資訊,到開發CMDB系統來進行資源的配置管理,從傳統上,運維的任務就是管理和配置所有的軟體和硬體,這些配置資訊對于保證基礎架構中的應用程式平穩運作至關重要,但這始終是一個漫長的過程。

IT基礎設施管理的痛點
長期以來,我們将伺服器部署到機房,對機器進行軟、硬體配置,安裝并初始化作業系統,在做好基礎配置後提供給業務部門;業務部門拿到機器後進行應用的部署,在這整個手動過程中通常會導緻很多問題。
成本問題
從網絡工程師到硬體維護人員,在流程的每一步必須有相應的專業人員來執行必要的任務,作為企業而言,聘請專業人員的報酬以及管理成本都是必不可少的,同時人員增多還會增加組織内部溝通的複雜性,錢花了也未必能建構和維護好自己的資料中心。
擴充性和可用性
由于手動配置太慢,當我們的應用遇到通路高峰,運維人員需要配置更多伺服器來增加負載,這必然會影響可用性,如果沒有提前準備好備份的伺服器甚至資料中心,可能導緻應用長時間不可用。
監控和性能可見性
應用上線後,如何確定我們的基礎架構正以最佳方式運作?當遇到問題時,又如何準确定位問題來自基礎設施的哪個位置?我們的應用的整體拓撲映射、事件關聯和根本原因分析,這些都需要我們去維護相應的業務關系,通過配置管理來完成。
不一緻性
如果有多個運維人員都在負責手動部署配置,基礎設施以及環境的不一緻性将成為不可避免的問題。
IaC(Infrastructure as code 基礎設施即代碼)
随着雲計算的到來,在很大程度上幫我們解決了上述的大部分問題,通過雲計算,我們甚至無需建構和維護自己的資料中心即可讓我們的應用運作起來。
不過,雲計算并不能解決所有問題。雖然它能夠讓我們快速設定基礎設施需求,進而解決高可用性和可擴充性等嚴重問題,但它對解決不一緻問題沒有任何幫助。當多個人員都在執行配置或變更時,差異必然存在。
而IaC(基礎設施即代碼)正好能夠彌補上面問題的缺失部分。
IaC是什麼
IaC(Infrastructure as code 基礎設施即代碼)是通過使用配置檔案來管理所有的基礎設施并自動化基礎架構管理。
使用基礎設施即代碼,我們的基礎設施配置會采用代碼檔案的形式。由于它隻是文本,是以可以輕松編輯、複制和分發它。我們可以使用VCS(版本控制系統)來管理配置檔案,就像管理任何其他源代碼檔案一樣。
IaC的優點
那麼IaC能給我們帶來什麼樣的好處呢?我簡單羅列了一下:
- 易于複制
- 易于檢視
- 易于銷毀
- 易于分享
- 易于移植
- 易于找到
- 易于稽核
- 易于復原
- 易于重構
如果你使用過雲平台的console來進行資源的管理,那你一定能夠體會到實作以上操作的繁瑣和複雜程度,如果隻是建立一次,後續就不用再管理操作的話還好,但往往我們需要不斷重複的建立、管理類似的基礎設施,當然我們可以通過調用雲平台的SDK或API來實作自動化操作,但這一方面增加了我們的開發成本,另一方面在跨雲平台使用時我們需要對不同的雲平台進行适配。
而使用IaC,則完全解決了我們上面遇到的問題,在友善管理基礎設施的同時,也實作了環境一緻性的管理。
通過VCS管理資源配置
使用IaC管理環境資源的一大好處是我們可以通過VCS(版本控制系統)像管理普通代碼檔案一樣來管理資源配置檔案,這樣我們在多人參與管理時對資源配置檔案的修改可以直接通過分支或Tag來進行管理,清晰記錄下所有的變更。
IaC工作原理
基礎設施即代碼工具的工作方式各不相同,通常可以分為兩種主要類型:遵循『指令式資源配置方法』的工具以及遵循『聲明式資源配置方法』的工具。
“指令式”和“聲明式”這兩個概念最初來自于程式設計語言,其中,指令式資源配置方法指的是資源使用者沒有正式編碼所需的狀态,并且由資源使用者來決定指令序列。最值得注意的是,指令式方法是不可重複的,當重複執行時可能會産生與預期不一緻的結果。
而聲明式資源配置方法指的是編寫一個配置檔案,描述想要的部署結果,然後由平台解析這個配置檔案并自動生成部署結果。聲明式方法是可重複的(幂等性),是以可以實作自動化,重複執行時如果狀态沒有變更則不會産生任何修改動作。
Terraform
目前,市場上存在很多基礎設施即代碼的自動化部署及編排工具,其中HashiCorp提供的開源軟體Terraform可以說已經是IaC事實上的标準,下載下傳超10億次,被全球企業廣泛采用,各大公有雲平台以及三方廠商都為其提供Provider,友善使用者以IaC的方式來管理雲平台資源。
Terraform 是一個安全、高效地部署、更改、版本化基礎設施和應用程式的工具,可以用來管理多層次的資源,從上層的軟體配置到底層的網絡、系統配置都可以使用 Terraform 統一進行管理。
Terraform 用配置檔案來描述一個應用,在将配置檔案與目前環境對比後,生成一個執行計劃,這個計劃會列出為了達到配置檔案中定義的狀态所需要執行的操作,然後執行計劃以達到期望的狀态。
Terraform 通過插件機制管理不同的資源提供者(Provider),以此來接入各種資源,如虛拟機,存儲,網絡和各種應用服務。
Terraform通過HCL語言來對資源進行聲明式描述,如下是一個資源聲明的示例:
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"]
}
owners = ["099720109477"]
}
resource "aws_instance" "this" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.small"
key_name = "ansible"
subnet_id = aws_subnet.subnet.id
vpc_security_group_ids = [aws_security_group.sg.id]
tags = {
Name = "ansible-${random_id.hash.hex}"
執行計劃
當資源配置檔案中聲明好資源後,Terraform可以通過執行
teffaform plan
指令來生成一份執行計劃,該執行計劃中可以預覽這份配置檔案執行後會産生的資源變更,使用者可以根據該計劃判斷結果是否符合預期。
執行變更
通過執行計劃預覽結果符合我們的預期後,如果想要真正的執行變更動作,可以通過
terraform apply
指令來執行變更,如果執行過程中發生錯誤導緻失敗,在配置正确的情況下可以重複執行該指令,以達到預期的資源狀态。
Terraform狀态
當我們執行
terraform applay
後,資源成功建立,Terraform會儲存一份資源的狀态檔案,通過該狀态檔案,後續我們對配置檔案做了修改,重新執行
terraform plan/apply
指令時,Terraform會比較新的配置與狀态檔案的差别,基于修改的部分去執行變更,變更後同樣會将狀态儲存至狀态檔案。
資源銷毀
在應用上雲後,尤其在公有雲環境下,在快速實作彈性伸縮的同時也能夠提高我們對資源的使用率,進而實作對成本的控制,通過Terraform建立的環境,因為資源的狀态都儲存在狀态檔案裡,在該環境再使用的時候我們可以通過
terraform destroy
指令友善的實作一鍵銷毀。
Terraform工作區
通過Terraform我們實作了對代碼定義的資源快速部署、更新以及銷毀的生命周期管理,在需要建立及管理多個不同環境時,我們可以通過建立不同的目錄來進行管理,但缺點是需要把資源配置檔案複制到不同的目錄,當修改資源配置檔案時需要同時修改不同目錄下的配置檔案。
那有沒有方法可以讓我們使用一份資源配置檔案實作多個環境狀态的管理呢?答案是肯定的,Terraform提供了工作區(workspace)的概念,通過workspace,我們可以在同一個目錄使用同一份資源配置檔案實作多個不同環境的管理。
terraform workspace
指令可以用來管理目前的工作區,這個指令包含一系列子指令:
terraform workspace new
指令用來建立新的工作區;
terraform workspace show
指令用來列印出目前使用的工作區;
terraform workspace list
指令會列印出存在的工作區,目前工作區使用*号标記;
terraform workspace select
指令用來選擇使用的工作區;
terraform workspace delete
指令用來删除已經存在的工作區。
CloudIaC
雖然Terraform提供了workspace讓我們能夠管理不同的環境,但當有多個人員需要對環境進行管理時還是會存在資源配置檔案分發、同步,狀态統一管理等問題,并且時常會發生操作時忘了切換目前工作區,導緻錯誤操作了目标環境的問題,CloudIaC可以幫助我們解決以上的管理問題。
環境即服務
CloudIaC是由雲霁科技開發的一個開源項目,該項目提出了『環境即服務』的理念,可以通過組織、項目、雲模闆、環境等管理次元,精确的授權使用者對環境的管理權限,讓使用者可以配置設定不同的角色對不同項目下的不同環境進行管理;在不同管理層級下,CloudIaC支援靈活的變量管理,可實作變量的繼承及重新指派,也可以友善的管理不同雲平台下的資源帳号。
漂移檢測
對于建立出來的環境,CloudIaC還支援對環境進行漂移檢測,如有帶外變更造成的漂移,可以在環境資源視圖中直覺的發現該環境是否有漂移發生,進而讓管理者可以快速發現并修複漂移。
自定義Pipeline
通過自定義Pipeline,CloudIaC可以在環境部署過程加入自定義步驟,實作與CI/CD流程打通。
安全合規
采用IaC的方式來進行環境管理的好處還在于我們可以将合規檢測前置,在環境資源建立之前,就可以通過解析代碼判斷出即将建立的資源屬性,進而檢測其是否符合規定的政策,CloudIaC中,我們通過内置OPA引擎,以政策即代碼的方式對雲模闆、環境進行合規政策的檢查,無縫嵌入到環境部署的流程中,進而確定資源的合規性。
應用部署
同時,CloudIaC将Terraform和Ansible進行了打通,讓我們可以在資源建立出來之後自動調用Ansible的playbook來完成應用的自動部署。
私有化部署
除了在公有雲環境下幫助管理IaC環境,CloudIaC還為私有雲、混合雲環境下使用Terraform提供了解決方案,除了使用公有雲平台提供的Provider之外,針對私有雲、專有雲、VMware、PaaS等服務,CloudIaC也針對相應場景提供Provider支援;針對企業内部私有化部署且因為安全因素不能通路外網的場景,CloudIaC還提供了私有的Provider Registry,通過在企業内部部署CloudIaC Registry,讓私有化部署場景下也可以順暢的使用IaC管理我們的環境。
總體來說,CloudIaC提供了較完善的環境管理視角,通過RBAC來控制不同角色的權限,同時在部署過程中可以實作審批管理,在資源建立後動态部署應用,并且支援合規檢測、自定義pipeline、漂移檢測等功能,感興趣的同學可以關注CloudIaC開源項目,歡迎大家提問題或建議,一起加入到CloudIaC的建設中來。
CloudIaC官網:
https://cloudiac.idcos.com/CloudIaC開源位址:
https://github.com/idcos/CloudIaCCloudIaC文檔:
https://cloudiac.readthedocs.io/zh/latest/