在上一篇部落格《自動化運維工具介紹》中提到,運維自動化就是将日常重複性工作按照事先設定的規則,讓其在一定時間範圍内自動地完成任務,在這之中不需要人工參與。而 Ansible 就是幫助運維人員實作自動化的工具之一。
一、Ansible 是什麼?
Ansible 是近年來新出現的輕量級自動化運維工具,由 Python 開發,糅合了衆多老牌自動化運維工具(Puppet、Chef、Cfengine、Fabric、Func)的優秀特性,能夠實作批量程式部署、批量執行指令的功能。除了批量程式部署、批量執行指令之外,Ansible 用于批量系統部署功能還在開發中,最終目标是實作批量系統、程式部署和執行指令這三部分功能,這樣就滿足了運維人員日常工作中的大部分需求。
Ansible 有豐富的内置子產品和開放的 API 接口,同時那些遵循 GPL 協定的企業或個人都可以随意修改和釋出自己的程式。Ansible 雖然使用極為簡單,但功能非常不簡單,完全沒有因為使用方式上的簡單而縮水。
作為自動化運維工具的新秀,Ansible 已經被 RedHat 官方收購,并在 GitHub 上備受關注。
二、為什麼要選擇 Ansible?
Ansible 在 2012 年釋出,最初是在美國開始流行的,這主要得益于其作者 Michael DeHaan 在美國 IT 圈的名氣和影響力,并且 Ansible 本身使用簡單但能實作的功能非常豐富,是以很受歡迎。選擇 Ansible 的因為主要有以下四點:
(1) Ansible 支援豐富的内置子產品,能夠實作的功能非常強大。500 多個内置子產品基本滿足日常運維工作需要。
(2) Ansible 是 agentless 類型的自動化運維工具,部署簡單。被管理端無需任何配置,由管理端配置好後即可使用。
(3) 在 Ansible 去中心化的概念下,隻要一個簡單的複制操作即可完成管理配置中心的遷移。
(4) Ansible 完全是基于 Python 開發的,而 Python 在國内很流行,這很友善運維人員對 Ansible 開放 API 接口做二次研發。
三、Ansible 是如何工作的?
對于管理大規模主機來說,Puppet 是首選,而對于管理小規模主機來說,可以使用 Ansible。
Ansible 是 agentless 類型的自動化運維工具,在被管理端無 agent 程式,是以底層通信軟體要依賴于系統軟體,在 Linux 系統下基于 OpenSSH 通信,在 Windows 系統下則基于 PowerShell,但管理端使用的必須是 Linux 系統。在管理端上,使用者通過認證後,就可以通過 Ansible 工具調用各應用子產品将要執行的指令推送至被管理端執行,并在執行完畢後自動删除臨時産生的檔案。根據 Ansible 使用過程中的不同角色,可分為:
① 使用者
② Ansible 工具集
③ 作用對象

注:左邊部分是使用者,中間部分是 Ansible 工具集,右邊部分是作用對象。
(1)使用者
Ansible 的使用者可以來源于多個次元,如上圖中的 Ansible 工作機制所示(圖檔來源于《Ansible 權威指南》)。
第一種方式:CMDB(Configuration Management DataBase,配置管理資料庫),CMDB 用于存儲和管理 IT 企業架構中的各種配置,是 ITLT 項目的核心工具。運維人員可以将 CMDB 和 Ansible 組合起來,通過 CMDB 下發指令來調用 Ansible 工具集并完成任務執行。
第二種方式:PUBLIC/PRIVATE CLOUD 方式,Ansible 提供了豐富的 API 程式設計語言接口(如 Python、PHP、Perl 等),基于 PUBLIC/PRIVATE CLOUD 方式可以通過調用 Ansible 的 API 接口來完成任務執行。
第三種方式:USERS 直接使用 Ad-Hoc 臨時指令集調用 Ansible 工具集來完成任務執行。
第四種方式:USERS 事先編寫好的 ANSIBLE PLAYBOOK,根據 Playbook(任務劇本)中事先編排好的任務集來按順序調用 Ansible 工具集完成任務執行。
(2)Ansible 工具集
ansible 指令是 Ansible 的核心工具,但 ansible 指令本身并不能完成任務的執行,而是通過調用 Ansible 的各個元件來實作功能的,是以 ansible 指令隻是 Ansible 執行任務的調用入口。參照上圖中的 Ansible 工作機制,ansible 指令可以了解為“總指揮”,它是通過“調兵遣将”來完成任務執行的。上圖的中間部分是 Ansible 工具集架構,中包含了可供 ansible 指令“使喚”(調用)的“兵将”(四個元件),分别為 INVENTORY(指令作用對象的配置檔案)、API(供程式調用的應用程式程式設計接口)、MODULES(豐富的内置子產品)和 PLUGS(内置的和可自定義的插件)。
(3)作用對象
Ansible 的作用對象,既可以是各類作業系統的主機(HOSTS),也可以作用于各類公有雲/私有雲,商業和非商業裝置的網絡設施。
下圖為 Ansible 的架構(圖檔來自 Ansible 官網)。
在上圖中,Users 是使用者接口,使用者通過使用者接口與 Ansible 的核心工具(ansible指令)打交道,但 Ansible 核心部分本身并不執行任何任務操作,而是通過調用 Ansible 的子產品來進行。例如,當要建立使用者時就需要調用 Ansible 使用者管理子產品,當要安裝程式時就需要調用程式包管理子產品。Ansible 子產品有兩種,一種是内置子產品(即為 Core Modules,核心子產品),一種是自定義子產品(Custom Modules)。
如果使用者需要處理的指令比較複雜,可以将多個指令編排寫在 Playbook (YAML 格式)檔案中,而 Ansible 可以通過調用這個 Playbook 檔案,根據 Playbook 檔案中編排的任務集按次序調用相應的子產品來完成任務執行。為了不讓 Playbook 顯得過于臃腫,也為了能夠重用代碼,還可以将 Playbook 組織成 roles 的目錄結構。
此外,每當 Ansible 執行了管理操作,應該發郵件通知使用者,是以可以通過調用郵件發送插件來實作,也可以調用日志記錄插件來實作日志記錄功能。Ansible 的插件是子產品功能的補充,其中比較重要的一個插件是連接配接類型插件(Connection Plugins),預設連接配接類型插件是基于 SSH 協定與被管理主機通信的,是以可以有賬号密碼認證和密鑰認證兩種方式。但是,為了安全起見,對于 Ansible 能夠管理的主機應該加以限制,需要将 Ansible 要管理的主機清單配置在 Host Inventory 中,而 Ansible 通過調用 hosts 檔案來确定一台主機是否可以被管理。
四、Ansible 的特性
Ansible 使用簡單,但實作的功能卻很豐富,其特性總結如下。
1、高度子產品化 ==> 實作的任何功能都是調用特定的子產品,完成特定的任務。
2、基于 Python 語言開發 ==> 主要調用了 Paramiko、PyYAML 和 JinJa2 這三個關鍵子產品。
3、部署簡單 ==> 這是 agentless 的特性,被管理端無需任何配置,在管理端上配置好後即可使用。
4、支援自定義子產品 ==> 可基于任何開發語言開發子產品。
5、支援 Playbook ==> 能将要處理的多個指令編排在 Playbook 中,然後依照次序執行任務。
6、具有幂等性 ==> 一個指令執行一次或多次的效果是一緻的。
五、Ansible 的安裝部署
5.1 安裝 Ansible
可以使用 epel 源安裝 Ansible,此處以 CentOS 7 系統為例。
[root@admin ~]# yum -y install ansible
5.2 Ansible 基礎元素介紹
配置檔案:/etc/ansible/ansible.cfg
主機清單:/etc/ansible/hosts
主程式:ansible、ansible-playbook、ansible-doc
① ansible ==> Ansible 核心工具
② ansible-playbook ==> 運作一個 playbook 檔案