Ansible

../../../../_images/68c978c6cb0189b17af2a436be100d25.png

IT 领域,你可能经常一遍遍重复着同样的操作任务。如果可以通过自动化一次性解决问题,你的双手将得到解放。这便是 Ansible 设计的初衷。

Ansible 是一个非常简单轻量级的 IT 自动化引擎,可应用与很多 IT 领域:

  • 云设施管控;
  • 配置管理;
  • 应用部署;
  • 服务编排;
  • etc

Ansible 通过描述 系统间关系 来为 IT 基础设施建模,从设计之初便瞄准多层部署场景,因此不局限于单个系统这种简单场景。

Ansible 非常容易部署,不需要客户端软件,也不需要额外的安全基础设施。更重要的是, Ansible 使用 YAML 这样简单的语言来描述自动化任务,非常接近英语大白话。

架构

../../../../_images/462873202d20007030f00f5a07c85155.png

Ansible 先连上目标节点,并推送一些称为 Ansible 模块( Ansible modules )的小程序。这些程序被设计成描述 系统目标状态 的资源模型,可以多次执行( 幂等性 )。此后, Ansible 执行这些模块(默认通过 SSH ),并在执行完毕后删除。

你的模块库可以部署在任意机器上,而且不需要任何服务、守护进程或者数据库来支撑。通常,你只需使用自己喜欢的 终端程序文本编辑器 以及一个可选的 版本控制工具 (用于管理内容变更),便可管理一切。

SSH密钥

Ansible 通过 SSH 管理目标节点,因此必须通过 SSH 认证。虽然密码认证也是支持的,但是 Ansible 更推荐使用 SSH 密钥。尽管如此,如果你想使用 Kerberos ,也是可以的。root 用户登录也不是必要的,你可以用任何用户登录,并通过 su 或者 sudo 命令切换到任何其他用户。

Ansible 提供内置模块 authorized_key ,可以用于控制哪些机器可以访问哪些机器。其他选项,例如 Kerberos身份管理系统 ( identity management systems )也可以使用。

  1. $ ssh-agent bash
  2. $ ssh-add ~/.ssh/id_rsa

设备清单

Ansible 默认通过一个非常简单的 INI 配置文件维护其管理的机器—— 清单 ( inventory )。通过该配置文件,你可以根据需要为机器进行分组。

添加机器无需额外的 SSL 签名,因此不会因 NTP 或者 DNS 问题导致机器不能导入。要知道,排查这些问题还是相当繁琐的。

可以看到,设备清单配置文件是非常直白的文本:

  1. [web]
  2. web01.example.com
  3. web02.example.com
  4. [db]
  5. db01.example.com
  6. db02.example.com

清单还支持为主机或者集群定义 变量 ,以此实现差异化操作。变量可以直接在清单配置文件中定义,也可以由额外的文本文件来定义(放置于 group_vars/ 或者 host_vars/ 子目录)。

如果你的基础设施体系由其他系统提供可靠的数据源, Ansible 也可以与其对接。例如,开发 动态清单 ( dynamic inventory ),从类型 EC2RackspaceOpenstack 等数据源中,获取 机器列表群组 以及 变量 等信息。

快速执行

只要有一个目标节点就绪,即可通过命令行执行任务,无需任何额外配置:

  1. $ ansible 10.0.1.1 -m yum -a 'name=httpd state=installed'
  2. $ ansible foo.example.com -a '/usr/sbin/reboot'

注意到,你可以执行确保系统最终状态的模块,或者直接执行原生命令行。这些模块写起来非常简便,而且 Ansible 已经有大量的积累,大部分问题解决方案唾手可得。

定义好设备清单之后,你可以非常方便地进行批量执行。例如,对 web 集群批量执行:

  1. $ ansible web -m ping

Ansible 包含一个由 内置模块 组成的巨大工具箱,数量超过 750 个。

执行簿

执行簿( playbooks )可以非常优雅地编排你的基础设施拓扑,可以通过非常详细的配置控制每次处理的机器数。执行簿让 Ansible 开始变得非常有趣了。

Ansible 有意将编排设计得尽量简单,因为自动化代码需要多年维护,语法特性必须简洁好记。

下面是一个执行簿样例。

  1. ---
  2. - hosts: web
  3. serial: 5
  4. roles:
  5. - common
  6. - webapp

本文只是介绍性概述,对此不再继续展开。完整文档可以跳转到 docs.ansible.com 查看,那里可以看到执行簿各种可能的用法。

扩展

Ansible 是一个非常灵活的引擎,你可以通过 模块插件 ,以及 API 等方式为其提供 功能扩展 ,或者 对接外部系统

Ansible 模块可以使用任何可以返回 JSON 格式结果的语言开发,包括: RubyPythonShell 等等。设备清单可以对接任何数据源,只需要写一个程序从中捞数据并以约定的 JSON 格式返回即可。Ansible 还提供了大量的 Python API 用于扩展 连接类型 ( SSH 不是唯一的 ),回调函数 ( callbacks ,例如控制日志输出格式),甚至添加新的服务端行为。

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../../../../_images/wechat-mp-qrcode.png小菜学编程

微信打赏