閱讀645 返回首頁    go 技術社區[雲棲]


Terraform/Ansible on Cloud--基礎設施和應用管理實踐

摘要:隨著雲計算、大數據、AI智能等前沿科技的發展,傳統的研發速度,越來越難滿足企業快速發展的需求。研發效能也成了繼商業模式、技術突破之後的另一核心競爭力。在由阿裏雲研發協同RDC以及阿裏雲雲棲社區聯合舉辦的首屆阿裏巴巴研發效能嘉年華上,來自阿裏雲飛天八部企業服務雲應用服務團隊的高級研發工程師簫竹為大家分享了基礎設施和應用管理實踐,主要介紹了Terraform和Ansible兩大自動化基礎設施和應用管理工具,並結合實際應用場景介紹了如何在雲上使用Terraform和Ansible工具提升基礎設施和應用管理的效能。


直播視頻請點擊

以下內容根據演講嘉賓現場視頻以及PPT整理而成

本次分享的主題將主要圍繞以下四個方麵:
  • 什麼是 IaC
  • Terraform和Ansible介紹
  • Terraform和Ansible的對比與結合
  • 操作演示

本次分享首先會通過具體的應用場景來向大家解釋什麼是基礎設施即代碼(IaC),第二個部分會著重介紹一些如何基於Terraform和Ansible實現對於基礎設施和應用的有效管理,接下來會著重分析Terraform和Ansible這兩個工具之間的差別以及它們是如何進行結合的,在分享的最後會通過兩個具體的示例來向大家展示如何基於Terraform和Ansible這兩個工具有效地部署應用。

一、什麼是IaC
應用場景1
某應用1,為了增大吞吐率,需要對其做一個流量均衡處理,以擴大並發數、縮短延遲,所以需要使用一個負載均衡和ECS的組合,其架構如下圖所示,一個負載均衡,下麵掛載兩台ECS。
ef8d146a3f78e234ce023a10d8af0d50bfacc6fa
應用場景1的具體實現步驟:首先會去新建一個SLB,然後在這個SLB下麵創建兩台ECS,同時為這兩個ECS設定一個安全組,並且為這個安全組指定規則配置,然後將這兩個ECS掛載到SLB下麵,添加為其後端服務器,並為SLB配置監聽端口,配置會話保持,並添加健康檢查。以上的工作最少需要8個步驟。
172e9cc82b837feca5d815f70af2700f5e7633bf

應用場景2
某應用2,需要隔離的網絡環境,這時就需要將應用搭建在VPC網絡內,其架構如下圖所示,在一個VPC下麵有兩台交換機,每個交換機下麵有一個負載均衡單元。
163af56900eb327000f31f2e5487f0ad05fc7375
應用場景2的具體實現步驟:首先去創建一個VPC,然後在VPC下麵創建兩台VSwitch交換機,並為這兩台交換機配置相應的NAT網關,然後為NAT網關新建共享帶寬包,接著在每個交換機下各自創建兩台ECS,並將ECS添加到SLB下麵,最後為其中的一個VSwitch創建一個SNAT網關,進而為其實現一個端口轉發。以上的工作的總體流程最少需要7個步驟。
01437ac0928615e3709a87b57a0566b660f0960a

應用場景3
隨著業務的調整和業務量的增大,需要增加更多的節點或者集群以承載更大的並發和訪問量,此時最簡單的方法就是在已有架構的基礎之上對已有的資源單元進行擴容。如下圖所示,這裏是對於應用場景2的擴容,需要在VPC下麵新建一個交換機單元,此時的實現步驟就是首先在VPC下麵新建一台交換機,然後在交換機下麵新建一個SLB和兩台ECS,然後將這個交換機和原來的NAT網關進行連接。
edfc208bcf145107f560c537fa47ab86d7281d5a

應用場景4
隨著應用種類的增加,ECS、SLB等資源的數目也在增加,那麼這時候應用就希望通過“打標簽”的方式實現對於資源和應用的有效區分。通常情況下的做法是手工去為這些資源進行打標簽,然後將這些應用和資源進行分組。
f63fb3252ee32aecaa368cae564571e27a5b61e3

應用場景5
隨著應用的不斷迭代,應用部署和發布的成本也在增加,那麼如何實現多個應用的快速部署和發布呢?
2f6f10cd7b31e7e85685d14be39dfa67ebf9db7a

以上所有的場景都有一些共性:
操作流程和基本配置都是固定的,基本都是通過手工操作實現的
  • 手工操作效率低、 時間長
  • 手工操作時可能導致錯誤
  • 手工操作過程沒有曆史記錄
  • 手工操作過程不能實現有效審計(不知道是誰做了什麼樣的操作)
  • 手工操作成本隨著業務的複雜而不斷增大

那麼如何去解決這些場景所麵臨的一些難題呢?這時候就不得不使用自動化去進行處理。正如下圖中所說的,我們可以將以上場景中這個相對固定的操作以及配置以代碼的形式寫入到模板裏麵,然後利用一些自動化的工具,比如Terraform和Ansible去讀取這些模板,並將這些模板轉化成為我們的資源,然後在轉化成為資源之後,再利用一些應用的部署模板實現將應用快速地部署到生成出來的資源上,這也就是基礎設施即代碼。
3b141bf486d13c5e1b7550cf204f26db3453fdee
那麼如何按照上述的思路解決場景3和場景5中遇到的難題呢?首先對於場景3的擴容問題,對已有的架構而言,首先需要去定義架構中已有的所有的資源,比如對於VPC而言,需要使用代碼的形式將VPC定義到模板裏麵,同樣的VSwitch也需要使用代碼的形式定義到模板裏麵,所有的資源都要以一個相對應的資源表示定義到模板裏麵,之後通過Terraform執行這個模板實現對於資源的一鍵快速部署。當這些資源生產成功之後,可以利用第三方工具Terraform - Inventory實現將資源的訪問信息直接轉化到一個Inventory文件裏麵。接著當Ansible拿到這個Inventory文件之後可以利用其應用部署的Playbook實現對於應用的快速部署。當業務量迅速增加,整個應用架構需要進行有效擴容的時候該如何做呢?其實隻需要在已有的資源模板中將其中的某個資源單元的數目由原來的數值增加到想要擴展的值,接著執行一次Terraform命令和Ansible命令就可以實現對於整個架構的快速擴容以及對於應用的快速部署。
d633a6156daad9be2444eed4e558563c3e3e516c

二、Terraform和Ansible介紹
接下來將會分享如何使用Terraform和Ansible實現對於基礎設施架構和應用的有效管理。

Terraform介紹
Terraform是一個IT的自動化運維工具,我們可以利用Terraform將整個基礎設施的搭建和管理的流程以代碼的形式定義模板,Terraform通過讀取這個模板來實現對於整個基礎設施的有效管理。正如下圖所示的,首先要對一些需要管理的資源以一種通用的語法定義到模板裏麵,然後執行Terraform命令,之後Terraform就會解析這個模板,並從模板中解析出來這些資源屬於哪個雲服務廠商並找到相應的Provider,再去調用對應的Open API,進而實現對於整個基礎設施資源的有效生產。在將這些資源生產成功之後會將這些資源的信息寫入到一個TF - State文件裏麵,這個文件將記錄當前模板所定義的資源的所有信息,也正是因為這個文件的存在,保證了所定義資源的前後端一致性,也為後續對一整套資源的版本控製提供了支持。
e40f1fcfb15f3f7fbbecce8ba6dfff5bfd218788

Terraform安裝
Terraform的安裝是比較簡單的,因為它是以一個二進製文件的形式呈現的,所以隻需要到Terraform的官網上找到對應平台的二進製包下載下來,並配置相應的環境變量就可以使用了。在環境變量配置完成之後,執行“terraform version”這個命令,如果能夠出現有效的版本號就說明Terraform已經安裝成功。
b1ad525926741931d1a5be02ce84791a146742bf


下圖所展現的就是Terraform資源的模板,模板裏麵定義的資源主要有兩個標識,一個是資源的標識,比如下圖中的alicloud_security_group定義的就是安全組資源,後麵的“group”表現的就是這個安全組資源在這個模板裏麵的名稱。按照這樣的方式就可以在模板裏麵定義很多資源,並且可以讓模板裏的資源相互引用,下圖的模板裏麵一共定義了4個資源:安全組、ECS、SLB和SLB Attachment,其中SLB Attachment可以將所定義的ECS掛載到我們的SLB下麵,整個過程非常方便,而且相互之間的引用也非常方便。
bf1a1f579cbca9e61dffc1068b8abb5843ff4263

Terraformd使用
Terraform的使用主要有三個非常基本的命令:
  • Terraform plan,實現對於模板所定義資源的預覽功能,在真正生產資源之前可以實時地去查看當前模板所要生產哪些資源。
  • Terraform apply,這就是真正地生產資源的過程,執行這個命令就可以解析模板進而調用相應的API去實現對於資源的真實生產,資源後續的更新也會通過這個命令進行。
  • Terraform destroy,就是當需要去釋放資源的時候,可以執行這個命令,從而達到對於模板所定義資源的全部釋放銷毀。
e2a639b245b5b0c37bc2f5f63a999b087ebf99f7
上圖展現的就是執行Terraform apply命令之後的運行結果,第一行綠色的文字顯示了這一次一共生產了6個資源,具體是哪些資源如上麵所展示的這樣。

資源拓撲映射
對於一個相對而言比較複雜的資源架構而言,如果將每個資源都進行模塊化,將架構轉化成為一個資源拓撲圖之後,它們之間的相互關係會非常複雜。對於這樣的非常複雜的相互依賴關係而言,如果我們用人工去進行搭建和連接這些關係,這時候的人工操作成本將會非常高。而使用Terraform工具,將它們之間的關係以代碼的形式進行定義,定義之後隻需要執行其中的一個命令或者兩個命令就可以實現對於資源的快速生產,而且資源生產的過程也將會非常方便。
e6a57424fb2570971059e169ecd07a1736da1cf7

Ansible介紹
和Terraform一樣,Ansible也是一個自動化的運維工具,但是Ansible除了能夠實現和Terraform一樣的生產、管理基礎設施之外,更主要的是它還能非常快速地將應用部署到所生產出的基礎設施上。Ansible的一個操作流程就是首先定義資源模板,然後利用Ansible命令去解析定義好的模板,找到相應的雲服務提供商,調用相應的API,從而實現對於雲資源的有效生產。在資源生產成功之後,使用動態Inventory文件或者其他工具實現對於Inventory文件的快速獲取,然後基於需要部署應用的Playbook就可以實現將應用部署到所生產出來的機器上。
366e540c1de760f1a557efbc1fde0e7454c07d57

Ansible安裝
因為Ansible是一個Python包,所以其安裝比較簡單,直接執行“sudo pip install ansible”就可實現對於Ansible的快速安裝。當然如果想過要通過Ansible生產阿裏雲的機器,由於目前Ansible還沒有將阿裏雲的Provider集成到自己的官方版本中,所以需要單獨安裝阿裏雲的Provider,其安裝也非常簡單,同樣是一個Python包,但是安裝之前需要先安裝一個footmark,footmark麵向阿裏雲服務的python包,提供了一係列管理阿裏雲服務的接口,應用這個包可以實現對於阿裏雲服務的有效管控,所以在安裝阿裏雲Provider之前首先需要安裝footmark,在將這兩個安裝成功之後,就可以通過實現一個簡單的環境配置來實現對於阿裏雲Provider的有效引用。
aa4f6fe26d11aa8fba631a01fb917ba297f9c1d0

Ansible模板
如下圖所示的是Ansible的模板,左邊所展示的是在這個模板裏麵所定義的一些參數,裏麵包含了鏡像ID、資源類型以及名稱,下麵是安全組的參數,比如安全組規則、入網規則以及出網規則。右邊展現的則是具體資源的模板定義,可以看出上麵是ECS Instance的資源,下麵是安全組的資源,最下麵則是將以上兩個資源的生產結果進行連接,也就是將生產出來的ECS加入到生產出來的安全組裏麵。
fec555cf6d036432e7b1b6047efbceb101b517e4

Ansible環境搭建以及應用部署
那麼Ansible具體在使用過程中如何實現整體的基礎設施以及應用的分布式部署的呢?可以通過下麵一個具體的示例為大家進行說明,大家想象這樣的一個場景,假如我們需要將多個應用部署到多台服務器上,這時該如何做呢?
9bb5114dcf8deeaff21d1a15c38c000d99402d94
通常的做法是首先可以通過控製台或者API來生產出多台ECS,並登陸到每台ECS上去執行應用部署腳本,進而實現應用的快速部署。那麼當使用Ansible之後,這樣的過程是否能夠變得更加簡單呢?答案是肯定的,使用Ansible進行部署時第一步同樣需要通過控製台或者API去生產出來我們想要的機器,並將這些機器的信息手動地寫入到Inventory文件中,再去編寫一個麵向應用部署的Playbook,然後結合Playbook以及Inventory文件使用Ansible就可以實現應用的快速搭建和部署。

以上的過程是否能夠再簡單一些呢?其實可以將整個生產資源的過程也進行自動化,也就是將基礎設施資源也定義成為模板,然後利用Ansible的Provider實現對於資源的快速搭建,在搭建成功之後利用Ansible的動態Inventory功能來動態地生產出想要的Inventory文件,接著使用已經定義好的Playbook實現應用的快速部署。整個過程從手動到自動化,可以看出它不僅僅是解決了流程上的複雜,而且也方便了後續應用的持續部署維護,將所有的這些步驟以及變更都以代碼的形式記錄到模板裏麵,每次隻需要執行模板就可以實現整個流程的快速部署。

三、Terraform和Ansible的對比和結合

Terraform和Ansible的對比
Terraform和Ansible之間有什麼區別呢?首先他們都可以實現對於基礎設施資源的創建、屬性資源的變更以及銷毀。那麼Terraform除了上述功能之外,由於其在資源生產成功之後會在本地以一個state文件的形式記錄整個資源的詳細信息,而這些信息的記錄使得整個模板所定義的資源可以保證前後端的高度一致性,可以有利於後續對於整個一套資源的有效的版本控製。同時Terraform擁有一個DataSource功能,利用這個功能可以實現對於已有資源的獲取,比如在生產資源之前想要查看當前有哪些可用區,有哪些可用鏡像等,所有的這些都可以通過DataSource實現。除此之外,Terraform的模板可以進行分享和重用,當其他人需要搭建同樣一套架構的時候隻需要將自己的模板分享給他,於是就可以實現對於相同資源的快速生產。
2dee3331d3c4faf05351ed7d2767b397e5757a50
同樣Ansible除了能夠實現對於一些基礎設施資源進行通用的管理之外,它還能夠對於一些已有的基礎設施資源進行狀態控製,比如想要通過代碼實現對於ECS資源的啟動、停止以及重啟操作,這時候就可以使用Ansible。其次,Ansible可以利用對於應用的快速部署的支持來實現對於多個應用的快速部署和維護,因為它支持了對於應用的快速部署,從而就可以解決基礎設施和應用的同步伸縮,就如同前麵提到的,當對於一個基礎設施資源單元進行擴容之後,隻需要使用相同的模板就可以同步實現對於應用的有效擴容。同樣的Ansible的模板也可以進行分享和重用,其Playbook也可以進行分享和重用。

Terraform和Ansible的結合
Terraform和Ansible除了有上述的區別之外,能不能進行有效的結合呢?答案是肯定的,而它們之間有效結合的方式就是利用一個第三方的工具——Terraform - Inventory,這個第三方工具能夠將Terraform生產出的資源轉化為Ansible想要的Inventory文件,達到這一目的之後,Ansible就可以利用已有的Playbook和得到的Inventory文件來實現對於應用的快速部署。
c3ae473cb4777bcb8df954863e530f0a5899a568

四、操作演示
接下來會通過兩個具體的實例向大家展示如何利用Terraform和Ansible這兩個工具實現對於WordPress的快速部署。
2a4a948779a62599f6d8f5174b537361688d2c37
基於Ansible實現對WordPress的快速部署
這個過程主要包含這樣的幾個步驟:首先需要定義一個資源模板,然後利用Ansible去生產這些資源,當資源生產出來之後去記錄相應的Inventory文件,然後利用已經寫好的部署WordPress的Playbook來實現對於WordPress的快速搭建。

基於Terraform和Ansible的結合實現對WordPress的快速部署
首先要去定義一個Terraform的資源模板,然後利用Terraform - Inventory文件實現資源向Inventory文件的轉化,最後利用Ansible實現對於應用的快速部署。

自動化能自動化的一切
可以看出當將整個部署的過程從手工操作轉化成自動化的時候,一切都會變得非常簡單,首先利用代碼去描述資源的定義、資源的部署,以及後續應用的定義、應用的部署,隻要整個過程中代碼編寫的比較好,代碼測試通過,那麼後續整個執行任務都不會出錯,而且代碼可以代替文檔,其語法都是相對比較簡單的,無須擔心文檔更新不及時或者因為成員溝通等造成的黑盒問題,也不用訪問生產環境就可以知道生產環境下的配置情況,利用這些自動化的工具可以有效地提高整個團隊的DevOps能力,進而可以提高整個團隊的效率。
ffac8d425cff059e3d17ba744b2a1fdec8491a46

參考

下圖展示了本次分享中涉及到的參考鏈接,大家可以在具體的網站上去尋找操作實例進行更加詳細的參考和學習。

b4c81254fb12c793071cd9fd5a14854405d7ee3a

最後更新:2017-07-06 23:32:34

  上一篇:go  泛金融賬務流水 存儲與快照回溯查詢 案例分享
  下一篇:go  ubuntu 安裝git