645
技術社區[雲棲]
Terraform/Ansible on Cloud--基礎設施和應用管理實踐
摘要:隨著雲計算、大數據、AI智能等前沿科技的發展,傳統的研發速度,越來越難滿足企業快速發展的需求。研發效能也成了繼商業模式、技術突破之後的另一核心競爭力。在由阿裏雲研發協同RDC以及阿裏雲雲棲社區聯合舉辦的首屆阿裏巴巴研發效能嘉年華上,來自阿裏雲飛天八部企業服務雲應用服務團隊的高級研發工程師簫竹為大家分享了基礎設施和應用管理實踐,主要介紹了Terraform和Ansible兩大自動化基礎設施和應用管理工具,並結合實際應用場景介紹了如何在雲上使用Terraform和Ansible工具提升基礎設施和應用管理的效能。本次分享的主題將主要圍繞以下四個方麵:
- 什麼是 IaC
- Terraform和Ansible介紹
- Terraform和Ansible的對比與結合
- 操作演示
本次分享首先會通過具體的應用場景來向大家解釋什麼是基礎設施即代碼(IaC),第二個部分會著重介紹一些如何基於Terraform和Ansible實現對於基礎設施和應用的有效管理,接下來會著重分析Terraform和Ansible這兩個工具之間的差別以及它們是如何進行結合的,在分享的最後會通過兩個具體的示例來向大家展示如何基於Terraform和Ansible這兩個工具有效地部署應用。
一、什麼是IaC
應用場景1
某應用1,為了增大吞吐率,需要對其做一個流量均衡處理,以擴大並發數、縮短延遲,所以需要使用一個負載均衡和ECS的組合,其架構如下圖所示,一個負載均衡,下麵掛載兩台ECS。


應用場景2
某應用2,需要隔離的網絡環境,這時就需要將應用搭建在VPC網絡內,其架構如下圖所示,在一個VPC下麵有兩台交換機,每個交換機下麵有一個負載均衡單元。


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

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

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

以上所有的場景都有一些共性:
操作流程和基本配置都是固定的,基本都是通過手工操作實現的
- 手工操作效率低、 時間長
- 手工操作時可能導致錯誤
- 手工操作過程沒有曆史記錄
- 手工操作過程不能實現有效審計(不知道是誰做了什麼樣的操作)
- 手工操作成本隨著業務的複雜而不斷增大
那麼如何去解決這些場景所麵臨的一些難題呢?這時候就不得不使用自動化去進行處理。正如下圖中所說的,我們可以將以上場景中這個相對固定的操作以及配置以代碼的形式寫入到模板裏麵,然後利用一些自動化的工具,比如Terraform和Ansible去讀取這些模板,並將這些模板轉化成為我們的資源,然後在轉化成為資源之後,再利用一些應用的部署模板實現將應用快速地部署到生成出來的資源上,這也就是基礎設施即代碼。


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

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

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

Terraformd使用
Terraform的使用主要有三個非常基本的命令:
- Terraform plan,實現對於模板所定義資源的預覽功能,在真正生產資源之前可以實時地去查看當前模板所要生產哪些資源。
- Terraform apply,這就是真正地生產資源的過程,執行這個命令就可以解析模板進而調用相應的API去實現對於資源的真實生產,資源後續的更新也會通過這個命令進行。
- Terraform destroy,就是當需要去釋放資源的時候,可以執行這個命令,從而達到對於模板所定義資源的全部釋放銷毀。

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

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

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

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

Ansible環境搭建以及應用部署
那麼Ansible具體在使用過程中如何實現整體的基礎設施以及應用的分布式部署的呢?可以通過下麵一個具體的示例為大家進行說明,大家想象這樣的一個場景,假如我們需要將多個應用部署到多台服務器上,這時該如何做呢?

以上的過程是否能夠再簡單一些呢?其實可以將整個生產資源的過程也進行自動化,也就是將基礎設施資源也定義成為模板,然後利用Ansible的Provider實現對於資源的快速搭建,在搭建成功之後利用Ansible的動態Inventory功能來動態地生產出想要的Inventory文件,接著使用已經定義好的Playbook實現應用的快速部署。整個過程從手動到自動化,可以看出它不僅僅是解決了流程上的複雜,而且也方便了後續應用的持續部署維護,將所有的這些步驟以及變更都以代碼的形式記錄到模板裏麵,每次隻需要執行模板就可以實現整個流程的快速部署。
三、Terraform和Ansible的對比和結合
Terraform和Ansible的對比
Terraform和Ansible之間有什麼區別呢?首先他們都可以實現對於基礎設施資源的創建、屬性資源的變更以及銷毀。那麼Terraform除了上述功能之外,由於其在資源生產成功之後會在本地以一個state文件的形式記錄整個資源的詳細信息,而這些信息的記錄使得整個模板所定義的資源可以保證前後端的高度一致性,可以有利於後續對於整個一套資源的有效的版本控製。同時Terraform擁有一個DataSource功能,利用這個功能可以實現對於已有資源的獲取,比如在生產資源之前想要查看當前有哪些可用區,有哪些可用鏡像等,所有的這些都可以通過DataSource實現。除此之外,Terraform的模板可以進行分享和重用,當其他人需要搭建同樣一套架構的時候隻需要將自己的模板分享給他,於是就可以實現對於相同資源的快速生產。

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

四、操作演示
接下來會通過兩個具體的實例向大家展示如何利用Terraform和Ansible這兩個工具實現對於WordPress的快速部署。

這個過程主要包含這樣的幾個步驟:首先需要定義一個資源模板,然後利用Ansible去生產這些資源,當資源生產出來之後去記錄相應的Inventory文件,然後利用已經寫好的部署WordPress的Playbook來實現對於WordPress的快速搭建。
首先要去定義一個Terraform的資源模板,然後利用Terraform - Inventory文件實現資源向Inventory文件的轉化,最後利用Ansible實現對於應用的快速部署。
自動化能自動化的一切
可以看出當將整個部署的過程從手工操作轉化成自動化的時候,一切都會變得非常簡單,首先利用代碼去描述資源的定義、資源的部署,以及後續應用的定義、應用的部署,隻要整個過程中代碼編寫的比較好,代碼測試通過,那麼後續整個執行任務都不會出錯,而且代碼可以代替文檔,其語法都是相對比較簡單的,無須擔心文檔更新不及時或者因為成員溝通等造成的黑盒問題,也不用訪問生產環境就可以知道生產環境下的配置情況,利用這些自動化的工具可以有效地提高整個團隊的DevOps能力,進而可以提高整個團隊的效率。

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