Ansible¶
在 IT 领域,你可能经常一遍遍重复着同样的操作任务。 如果可以通过自动化一次性解决问题,你的双手将得到解放。 这便是 Ansible 设计的初衷。
Ansible 是一个非常简单轻量级的 IT 自动化引擎,可应用与很多 IT 领域:
- 云设施管控;
- 配置管理;
- 应用部署;
- 服务编排;
- etc
Ansible 通过描述 系统间关系 来为 IT 基础设施建模,从设计之初便瞄准多层部署场景, 因此不局限于单个系统这种简单场景。
Ansible 非常容易部署,不需要客户端软件,也不需要额外的安全基础设施。 更重要的是, Ansible 使用 YAML 这样简单的语言来描述自动化任务,非常接近英语大白话。
架构¶
Ansible 先连上目标节点,并推送一些称为 Ansible 模块( Ansible modules )的小程序。 这些程序被设计成描述 系统目标状态 的资源模型,可以多次执行( 幂等性 )。 此后, Ansible 执行这些模块(默认通过 SSH ),并在执行完毕后删除。
你的模块库可以部署在任意机器上,而且不需要任何服务、守护进程或者数据库来支撑。 通常,你只需使用自己喜欢的 终端程序 、 文本编辑器 以及一个可选的 版本控制工具 (用于管理内容变更),便可管理一切。
SSH密钥¶
Ansible 通过 SSH 管理目标节点,因此必须通过 SSH 认证。 虽然密码认证也是支持的,但是 Ansible 更推荐使用 SSH 密钥。 尽管如此,如果你想使用 Kerberos ,也是可以的。 root 用户登录也不是必要的,你可以用任何用户登录, 并通过 su 或者 sudo 命令切换到任何其他用户。
Ansible 提供内置模块 authorized_key ,可以用于控制哪些机器可以访问哪些机器。 其他选项,例如 Kerberos 、 身份管理系统 ( identity management systems )也可以使用。
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
设备清单¶
Ansible 默认通过一个非常简单的 INI 配置文件维护其管理的机器—— 清单 ( inventory )。 通过该配置文件,你可以根据需要为机器进行分组。
添加机器无需额外的 SSL 签名, 因此不会因 NTP 或者 DNS 问题导致机器不能导入。 要知道,排查这些问题还是相当繁琐的。
可以看到,设备清单配置文件是非常直白的文本:
[web]
web01.example.com
web02.example.com
[db]
db01.example.com
db02.example.com
清单还支持为主机或者集群定义 变量 ,以此实现差异化操作。
变量可以直接在清单配置文件中定义,也可以由额外的文本文件来定义(放置于 group_vars/
或者 host_vars/
子目录)。
如果你的基础设施体系由其他系统提供可靠的数据源, Ansible 也可以与其对接。 例如,开发 动态清单 ( dynamic inventory ), 从类型 EC2 、 Rackspace 、 Openstack 等数据源中, 获取 机器列表 、 群组 以及 变量 等信息。
快速执行¶
只要有一个目标节点就绪,即可通过命令行执行任务,无需任何额外配置:
$ ansible 10.0.1.1 -m yum -a 'name=httpd state=installed'
$ ansible foo.example.com -a '/usr/sbin/reboot'
注意到,你可以执行确保系统最终状态的模块,或者直接执行原生命令行。 这些模块写起来非常简便,而且 Ansible 已经有大量的积累,大部分问题解决方案唾手可得。
定义好设备清单之后,你可以非常方便地进行批量执行。例如,对 web
集群批量执行:
$ ansible web -m ping
Ansible 包含一个由 内置模块 组成的巨大工具箱,数量超过 750 个。
执行簿¶
执行簿( playbooks )可以非常优雅地编排你的基础设施拓扑, 可以通过非常详细的配置控制每次处理的机器数。 执行簿让 Ansible 开始变得非常有趣了。
Ansible 有意将编排设计得尽量简单,因为自动化代码需要多年维护,语法特性必须简洁好记。
下面是一个执行簿样例。
---
- hosts: web
serial: 5
roles:
- common
- webapp
本文只是介绍性概述,对此不再继续展开。 完整文档可以跳转到 docs.ansible.com 查看,那里可以看到执行簿各种可能的用法。
扩展¶
Ansible 是一个非常灵活的引擎,你可以通过 模块 、 插件 , 以及 API 等方式为其提供 功能扩展 ,或者 对接外部系统 。
Ansible 模块可以使用任何可以返回 JSON 格式结果的语言开发,包括: Ruby 、 Python 、 Shell 等等。 设备清单可以对接任何数据源,只需要写一个程序从中捞数据并以约定的 JSON 格式返回即可。 Ansible 还提供了大量的 Python API 用于扩展 连接类型 ( SSH 不是唯一的 ), 回调函数 ( callbacks ,例如控制日志输出格式),甚至添加新的服务端行为。