巧用Terraform和Packer開源工具完成雲上自動運維
2017年在線技術分會——運維/DevOps在線技術峰會上,來自阿裏雲的黎山分享了利用開源DevOps工具完成雲上的自動運維的實踐。她首先通過對5個應用場景的分析引出了“自動化能自動化的一切”的理念。然後介紹了使用Terraform和Packer開源工具完成雲上自動運維的具體實現過程。最後對多工具組合案例進行了分享。
以下內容根據直播視頻整理而成。
雲計算的特點是開箱即用,可以隨時擴縮容,不用考慮硬件的損壞問題,而且有豐富的雲平台和雲產品供選擇。
應用場景分析
應用1
某應用1,為了增大吞吐率,做了流量均衡處理、擴大並發數、縮短延遲,選擇了將兩台ECS掛在一個SLB基礎設施上的組合。要實現上述架構需要進行以下八個步驟來完成基礎設施的構建:創建ECS、創建安全組、添加安全組規則、創建SLB、添加後端服務器、配置監聽端口、配置會話保持、添加健康檢查。
應用2
應用2的特點是需要做網絡隔離,需要將其整個的應用架構搭在VPC網絡內,同時有對外網絡訪問的需求,同時也有應用對外提供服務。所以,整個的架構是VPC下麵有兩個子網,通過NAT網關和共享帶寬包提供對外請求,然後通過負載均衡提供入網能力。要實現以上架構需要七個步驟:創建VPC、創建VSWITCH、創建NAT網關、新建共享帶寬包、創建ECS、創建SLB、創建SNAT、掛載SLB。
應用3
應用3與應用2的基礎設施要求一樣。此時需要按照固定流程手工再做一次重複的工作。由於人員流動,文檔不全,會導致接手的人需要幾天的時間熟悉環境及各種配置。
應用4
隨著應用的增加,ECS、SLB等資源也在增加,希望通過“打標簽”區分哪些資源屬於哪些應用,將資源按照應用分組。此時需要找到資源和應用的對應關係,再把每個資源都打上標簽。
應用5
應用2深受市場歡迎,流量暴增,需要增加ECS以承載更多的並發和訪問量,需要擴容一台與線上應用一致的ECS,掛載到SLB上。此時,需要四步來完成上述任務:將應用的ECS打快照、生成鏡像、基於此鏡像創建ECS、添加到SLB。
通過以上場景分析,我們發現操作流程是有序可循的,配置是固定的。如果全部由手工操作來完成的話,效率低、時間長,可能導致錯誤,變更不能回滾,過程沒有曆史記錄,過程不能審計(不知道是誰做了什麼樣的操作)。解決上述問題的方法是自動化。
自動化能自動化的一切
上圖有三條主線,第一條是利用Packer去生成鏡像,自動存儲在鏡像列表中,用Terraform去自動創建更新或者銷毀這些基礎設施。在創建ECS的時候可以選擇Packer創建出來的鏡像ID,同時在運行期可以使用Ansible去管理這些基礎設置或者管理ECS上麵的應用。
針對場景5的IaC思路
場景5的需求是擴容一台與線上應用一致的ECS。具體的操作流程是利用Packer去創建鏡像,把提供服務的應用打到鏡像中,用Terraform去創建ECS及其他資源,創建ECS的時候選擇Packer打出來的ID。變更的時候隻需要修改Terraform的模板,把ECS變量的參數加1。
Terraform/Packer介紹
他們屬於HashiCorp家族。他們具有兩大特點:支持多平台,開源。
Terraform
Terraform的安裝如上圖所示。
上圖是Terraform的一個模板,其最重要的是resource,其後有兩個字串(資源名稱是固定的,別名可自定義)。安全組規則中,alicloud_security_group_role是固定的,可以定義安全組的出網入網規則、端口、規則作用的安全組、指定網段。對於ECS實例,可以指定instance的name、鏡像ID、實例類型、創建的數量(count)、ECS的安全組、收費類型、帶寬、是否IO優化、是否分配公網IP、可用區、實例的收費類型、係統盤類型等。SLB同樣可以指定name、收費類型等。SLB掛載定義了SLB和instance的主要參數。
Terraform最重要的三個命令是plan、apply和destroy,plan命令會在執行之後看到參數的所有值以及要創建哪些資源,如果沒有問題的話就執行apply去真正創建這些資源,可以通過destroy做銷毀。
上圖是VPC集群的資源拓撲圖,從下往上有VPC、VSWITCH,有安全組的規則作用在安全組上,VSWITCH下有兩個實例,即別名worker的ECS實例和別名為master的ECS實例。eip綁定在別名為master的實例上,自定義路由的下一跳指定的是別名為master的實例。
Packer
Packer主要的思想是通過模板來定義一些內容然後創建鏡像。在此過程中,Packer支持基於創建阿裏雲基礎鏡像創建鏡像,以及基於自定義鏡像創建鏡像,會根據模板定義自動創建經典網絡ECS或者是VPC網絡的ECS。在ECS之上安裝相關的應用,並把ECS打一個快照,根據快照生成鏡像,當鏡像創建完成之後釋放掉過程中創建過的資源,最後還可以做進一步的操作,比如彈性伸縮、共享鏡像、複製鏡像。
上圖是Packer的典型模板,最重要的是builders和provisioners。builders的type決定鏡像的用處,provisioners裏麵定義鏡像要做的任務。
多個工具組合案例
案例1
可以利用Packer製作鏡像,生成鏡像ID,然後用Terraform的模板指定鏡像ID,創建ECS,這個ECS就自帶了所要提供應用的服務。這種方案的好處是一次製作、重複利用,免去每次創建機器、安裝服務的重複過程。
案例2
可以利用Packer把應用打在鏡像中,通過ESS做伸縮,可以用Terraform創建ESS的模板做彈性伸縮。很多用戶做彈性伸縮的過程中很麻煩的一點是在最初的時候ECS所用的鏡像是基礎鏡像(隻有一個操作係統的鏡像),那麼彈出來的機器是不能提供服務的實例,結合Packer則可以解決這個問題。
案例3
將Terraform和Ansible做結合。Terraform在執行完成之後會在本地生成一個tfstate文件,利用開源插件Terraform Inventory可以通過tfstate生成Ansible Inventory(用來做機器分組)。Ansible可以通過讀Inventory文件對指定的分組做管理或應用配置。
總結
前麵的思想可以歸納為一句話:自動化能自動化的一切。其優點是:用代碼描述基礎設施的創建、變更、銷毀;代碼編寫好,驗證也是正確的,之後每次執行任務都不會出錯;非常快速,高效;代碼代替文檔,有曆史記錄,可回滾,不用擔心文檔更新不及時或人員流動帶來的“黑盒”問題;不用通過訪問生產環境,就能知道生產環境上的配置情況;提高整個團隊的DevOps能力。
- 雲棲公眾號:https://yq.aliyun.com/opstools
- Terraform Aliyun官方 Github地址:https://github.com/alibaba/terraform-provider
- Packer Aliyun官方 Github地址:https://github.com/alibaba/packer-provider
- Terraform 官方地址:https://www.terraform.io
- Packer官方地址:https://www.packer.io
最後更新:2017-04-25 00:01:36