Ansible_(軟體)

**Ansible** 是一套軟體工具，其可實現基礎架構即程式碼。它是開源的，並且該套件包括軟體供應、組態管理和應用程式部署等功能。 

Ansible 最初由 Michael DeHaan 編寫，並於 2015 年被 Red Hat 收購，其旨在自動化設定類 Unix 系統和 Microsoft Windows 的環境。Ansible 是無代理的，藉由透過 SSH 或允許 PowerShell 執行的 Windows 遠端管理機制來建立臨時遠端連線。 Ansible 的控制節點在大多數已安裝 Python 的類 Unix 系統上執行，亦包含安裝了 WSL 的 Windows 系統。 系統組態部分是透過使用它自己的宣告式語言來定義的。

## 歷史

"ansible" 一詞是由 Ursula K. Le Guin 在她 1966 年的小說 _Rocannon 的世界_中所創造的，指的是虛構的即時通訊系統。 

Ansible 工具是由供應伺服器應用程式 Cobbler 的作者與用於遠端管理的 Fedora 統一網路控制器 (Func) 框架其合著者 Michael DeHaan 所開發。 

Ansible, Inc. (原 AnsibleWorks, Inc.) 是由 Michael DeHaan、Timothy Gerla 和 Saïd Ziouani 於 2013 年所創立的公司，旨在為 Ansible 提供商業支持和贊助。 紅帽公司 於 2015 年 10 月收購了 Ansible。 

Ansible 被包含在 Red Hat 所擁有的 Fedora Linux 發行版中，也可透過 Extra Packages for Enterprise (EPEL) 套件用於 Red Hat Enterprise Linux、CentOS、openSUSE、SUSE Linux Enterprise、Debian、Ubuntu、Scientific Linux 和 Oracle Linux 以及其他作業系統。 

## 架構

### 概述

Ansible 藉由選擇以簡單的 ASCII 文字檔案來儲存的部分 Ansible 存儲庫來幫助管理多台設備。存儲庫是可配置的，而目標機器的存儲庫可以動態取得，也可以從雲端服務中不同檔案格式 (YAML、INI) 的來源中取得。 

從 2014 年以來，敏感資料可以使用 Ansible Vault 儲存在加密文件中。與其他流行的組態管理軟體 (如 Chef 、 Puppet 、 Salt 和 CFEngine) 相比，Ansible 使用_無代理架構_，亦即 Ansible 軟體無須在控制節點上正常運行，甚至無須安裝在控制節點上。Ansible 藉由透過 SSH 臨時在節點上安裝和執行模組來管理節點。在執行一個管理任務期間，執行模組的行程使用基於 JSON 的協定在其標準輸出入界面來與被控制的機器溝通。當 Ansible 不管理節點時，因為沒有執行任何後台程式或安裝任何軟體。 ，它不會消耗節點上的資源

#### 相依套件

Ansible 要求在所有被管理的機器上安裝 Python ，包含 pip 套件管理器、組態管理軟體以及其相依套件。受控網路設備不需要額外的相依套件，並且是無代理狀態的。 

### 控制節點

控制節點 (主控主機) 主要是在管理 (協調) 目標機器（稱為 "存儲庫" 的節點，見下文）的運作。 控制節點僅適用於 Linux 等作業系統，不支援 Windows 作業系統。其允許多個控制節點。 Ansible 不需要單一控制機器來進行協調管理，其確保可用簡單的方式來做災難復原。節點是由控制節點透過 SSH 來管理。

### 設計目標

Ansible 的設計目標包括：

* 本質上為最小。管理系統對環境不應該施加額外的相依套件。
* 一致性。使用 Ansible 應該能夠建置有一致性的多個環境。
* 安全。 Ansible 不會佈署代理程式到節點，受控節點上只需要 OpenSSH 和 Python 。
* 可靠的。如果小心地撰寫程式，Ansible playbook 腳本檔案可以是冪等的，以防止對受控系統產生意外的副作用。 然而想要編寫非冪等的 playbook 腳本檔案是可以的。
* 僅需要最少的學習。 Playbook 使用基於 YAML 和 Jinja 模板的簡單敘述性語言。

### 模組

模組大多是獨立的，可以用標準腳本語言 (如 Python、Perl、Ruby、Bash 等) 來撰寫。模組的指導目標之一是冪等性，這意味著即使多次重複操作 (例如從系統錯誤中復原時)，它也會始終將系統置於相同的狀態。 

### 儲存庫配置

目標節點的位置是透過 (在 Linux 系統上) 位於 `/etc/ansible/hosts` 的清單配置列表 (INI 或 YAML 格式) 來指定。 配置文件列出了 Ansible 可訪問的每個節點的 IP 地址或主機名稱。此外，可以用群組的方式來分配節點。 

以下是一份範例清單 (INI 格式)：

此配置文件指定了三個節點：第一個節點由 IP 地址指定，後兩個節點由主機名稱來指定。此外，後兩個節點被分配給 `webservers` 群組。

Ansible 還可以使用自定義的_動態清單_腳本，該腳本可以從不同的系統中動態取得資料，並支援以群組來分配群組。 

### Playbook 腳本

Playbook 腳本是內含任務列表的 YAML 文件，其用於在受控節點上重複 執行。 每個 Playbook 都將一組主機映射 (關聯) 到一組角色。每個角色都由對 Ansible 任務的呼叫來表示。 

### Ansible 自動化平台

Ansible 自動化平台 (Ansible Automation Platform) 是一個 REST API 、 Web 服務和基於 Web 的界面（應用程式），旨在使具有廣泛 IT 技能的人更容易使用 Ansible。它是一個由多個組件組成的平台，包括開發人員工具、操作界面以及自動化網路，以實現跨數據中心的大規模自動化任務。 AAP 是 Red Hat, Inc. 支持的商業產品，但衍生了 17 個以上的上游開源項目，包括 AWX 上游項目 (Ansible Tower 衍生自該項目的前身)，該項目自 2017 年 9 月開始開源。 

還有另一個 Tower 的開源替代品 _Semaphore_ ，它是用 Go 編寫的。 

## 平台支援

控制機器必須是 Linux/Unix 主機（例如 BSD 、 CentOS 、 Debian 、 macOS 、 Red Hat Enterprise Linux 、 SUSE Linux Enterprise 、 Ubuntu ，並且需要 Python 2.7 或 3.5。 

託管節點（如果它們是類 Unix）必須具有 Python 2.4 或更高版本。對於使用 Python 2.5 或更早版本的託管節點，還需要 `python-simplejson` 套件包。 從 1.7 版本開始，Ansible 還可以管理 Windows 節點。 在這種情況下，將使用 WS-Management 協議支持的本機 PowerShell 遠程處理，而不是 SSH。

Ansible 可以部署到裸機主機、虛擬機和雲環境。 

## AnsibleFest

AnsibleFest 是讓 Ansible 社群用戶、貢獻者等人參加的年度研討會。 

## 參見

* 開源組態管理軟體的比較
* 基礎設施即代碼 (IaC)
* CFEngine (軟體)

## 參考文獻

## 外部連結

* 官方網站