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 格式)：

```yaml
192.168.6.1

[webservers]
foo.example.com
bar.example.com
```

此配置文件指定了三个节点：第一个节点由 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 社群用户、贡献者等人参加的年度研讨会。

年｜地点

2014｜加利福尼亚州旧金山

2015｜英国伦敦

2016 年｜英国伦敦

2016 年｜加利福尼亚州旧金山

2016 年｜布鲁克林，纽约

2017年｜英国伦敦

2017年｜旧金山

2018｜德克萨斯州奥斯汀

2019｜美国佐治亚州亚特兰大

2020｜因COVID-19 大流行而线上举行

2021｜因COVID-19 大流行而线上举行

2022｜伊利诺伊州芝加哥

2023｜波士顿

## 基本资料

- 日语原文：Ansible
- 作者：Michael DeHaan
- 开发者： Ansible 社群 / Ansible Inc. / Red Hat Inc.
- 发行日期：2012年2月20日
- 编程语言：Python, PowerShell, Shell, Ruby
- 操作系统：Linux, 类Unix, MacOS, Windows
- 语言：英文
- 类型：组态管理, 基础架构即程式码 (IaC), Orchestration engine
- 许可协议：专有软件 / GNU通用公众授权条款