在上一篇博客《自动化运维工具介绍》中提到,运维自动化就是将日常重复性工作按照事先设定的规则,让其在一定时间范围内自动地完成任务,在这之中不需要人工参与。而 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 文件
③ ansible-doc ==> 查看 Ansible 模块的文档