天天看點

基于資源編排和 Ansible 在 VPC 下快速傳遞應用

阿裡雲資源編排服務(ros)為我們快速搭建和整合雲計算資源環境提供一個低成本、标準化的方案。基于ros提供的能力,我們所要做的就是将所需的資源以資源模闆的形式進行定義,進而實作對所定義雲資源的快速生産。除此之外,ros 将應用傳遞和資源釋放的過程也進行了簡化。

可以說,ros 幫助我們快速搭建了資源環境,ansible 可幫助我們在已搭建好的資源環境中實作了應用的快速傳遞。

本文将介紹利用 ros 和 ansible 實作對應用的快速傳遞。為了更好的了解應用傳遞的整個實作過程,本文首先對 ansible 及其運作機制進行簡單的介紹,然後講述基于 ros 和 ansible 快速傳遞應用的過程,最後以搭建 redis 叢集作為示例,展示整個應用傳遞過程,本文大緻流程如下:

ansible 及其運作機制

基于 ros 和 ansible 快速傳遞應用

基于 ros 和 ansible 快速搭建 redis 叢集

ansible 是一個基于 python paramiko 開發的、分布式的、需用戶端的、輕量級的自動化運維管理工具,它可以實作自動化部署應用、配置、執行 task 等工作。面對多台伺服器的運維工作時,它大大簡化了運維人員的工作量,降低了應用的部署和傳遞成本。

ansible 使用 ymal 文法及 jinja2 模闆語言,采用 paramiko 協定庫,通過 ssh 或者 zeromq 等方式連接配接工作主機,進而實作對遠端主機的控制和維護。ansible 一般每兩個月出一個發行版本。

ansible的運作機制:管理節點 master 利用存放節點資訊的 inventory 檔案将 ansible 子產品通過 ssh 協定(或者 kerberos、ldap)推送到被管理節點,然後執行 playbooks,執行結束後自動删除,如下圖所示:

基于資源編排和 Ansible 在 VPC 下快速傳遞應用

由上圖可知,ansible主要有五部分組成:

master:ansible 的控制節點核心

inventory:定義 ansible 管理主機的清單

playbooks:定義 ansible 執行任務檔案及其配置檔案

modules:包括 ansible 自帶的核心子產品及自定義子產品

plugins:完成子產品功能的補充

在了解了 ansible 的運作機制後,接下來将介紹利用 ros 快速生産應用運作環境,并結合 ansible 實作對應用的快速傳遞,大緻流程如下:

基于資源編排和 Ansible 在 VPC 下快速傳遞應用

安裝 ros sdk 和 ansible

基于 ros 建立資源棧,搭建資源環境

擷取主機資訊,并建立 inventory 檔案,擷取 playbook

執行 playbook,完成應用的快速傳遞基于 ansible 快速部署應用

值得注意的是,本文介紹的快速傳遞應用是在 vpc 環境下進行的,并且過是以 python 的形式執行的,是以在開始之前,需要有一台可以通路公網的 ecs 作為 master,以執行所有的 python 程式。下面詳細介紹基于 ros 和 ansible 快速傳遞應用的流程。

根據 ansible 的運作機制,在搭建好資源環境後,首先需要根據資源棧的建立結果,再次調用 ros api 以擷取雲主機資源的登入資訊,如:主機 ip、主機登入密碼等。然後利用主機資訊生成 inventory 檔案,以作為 ansible 管理主機的清單。在 inventory 檔案中,你可以定義登入雲主機的方式,如下是一個示例 inventory 檔案:

檔案中定義了遠端主機 <code>webservers</code>,并指明了該主機組下有兩台雲主機的登入位址、登入協定(預設是 ssh )、登入端口、登入使用者名和密碼。

最後,根據所要部署的應用,可在 ansible 社群中查詢并擷取應用相關的 playbook。當然,除了這種擷取方式,您還可以根據應用部署的過程,依據 ymal 文法和 jinja2 模闆語言編寫自己的playbook。

ansible 在運作 playbook 時需要指定執行檔案,執行檔案可根據 inventory 檔案和 playbook 進行編寫。執行檔案中需要指定所要運作的 playbook 名稱和遠端主機或者遠端主機組名,如下是一個執行檔案 example.yml,檔案中顯示了對遠端組<code>webservers</code> 執行名稱為 example 的 playbook:

執行檔案編寫成功後,運作以下指令即可完成對 playbook 的執行:

為了更好的說明基于 ros 和 ansible 快速傳遞應用的過程,本文将以搭建 redis 叢集作為展示示例。

目前我已經建構好了我的 vpc 環境,我的 master 上已經安裝了 ros sdk 和 ansible,下面我将展示基于 ros sdk 和 ansible 快速搭建一主(master)兩備(slave) redis 叢集的詳細過程。

為了提高 redis 叢集的高可用性,在搭建 redis 叢集時為其部署了高可用性解決方案 sentinel,以幫助 redis 叢集實作自動化的主備切換。

首先定義資源棧模闆。由于我已經建構好了我的 vpc 環境和控制節點 master,是以模闆中隻需要定義建構三台雲主機 ecs 資源并與已有的 vpc 環境相關聯即可。為了友善起見,我在模闆中使用資源 <code>"type": "aliyun::ecs::instancegroup"</code> 定義 ecs 資源。定義資源棧的模闆可詳見附件中的 python 檔案 create_instancegroup_template.py。

模闆定義成功後,編輯 python 代碼,以模闆作為參數,調用 ros api 即可實作對資源環境的搭建,如下是調用 ros api 的 python 檔案 create_stack_instancegroup.py:

接下來建立 inventory 檔案。為了省去手動編寫 inventory 檔案的麻煩,本文使用 python 程式自動生成。首先在棧資源建立成功後,再次調用 ros api 擷取資源 ecs 的登入資訊,由于資源棧的建立時間一般需要2~5分鐘(視具體情況而定),是以在程式中需設定一定的等待時間,如下所示:

擷取雲主機 ip 後,即可開始生成 inventory 檔案,由于遠端主機的登入密碼在建立資源棧時指定的,是以此處可直接引用,如下所示:

搭建 redis 叢集的 playbook davidwittman.redis 擷取成功後,由于 davidwittman.redis 編寫完成時預設隻部署了 sentinel,沒有實作 redis 叢集的主備配置,是以在運作 davidwittman.redis 前,需要對 davidwittman.redis 的 /tasks/main.yml 進行修改,使其完成分布式 redis 叢集的搭建,如下所示:

在執行 playbook 前需要編寫 playbook 的執行檔案。和 inventory 檔案一樣,執行檔案可根據下載下傳的 playbook 利用程式自動生成,如下所示:

程式中使用到的生成執行檔案的模闆檔案redis_playbook_template.py 可詳見附件。

接下來即可通過運作 ansible 的指令 <code>ansible-playbook</code> 執行 playbook ,進而完成 redis 叢集的搭建,如下所示:

建立 inventory、擷取 playbook、生成執行檔案以及執行 playbook 的代碼可詳見附件中的 execute_redis_playbook.py 檔案。

python 代碼執行的 main.py 如下所示:

在運作 main.py 前,需要指定賬戶的 accesskeys 資訊、雲主機密碼以及可用區。

以上便是基于 ros 和 ansible 搭建 redis 叢集的全部過程,示例中 redis 叢集中節點數量是三個,當然也可以通過修改雲主機 ecs 的數量,實作對單個節點或更多節點的 redis 叢集的搭建。本示例 redis 叢集搭建成功後的資源拓撲圖如下所示:

基于資源編排和 Ansible 在 VPC 下快速傳遞應用