1 概述

1.1 Ansible简介

Ansible是一种IT自动化工具,更具体地说,它是一种配置管理工具,用于将一个或一批主机配置到一个确定的状态。下面是Ansible的典型用途:

  • 配置服务器状态。例如给服务器安装Java和NodeJS。
  • 部署服务/应用到服务器。例如给服务器部署Tomcat或MySQL。
  • 在服务器上进行编配(Orchestration)。例如在启动Tomcat之前先启动MySQL,或者为了实现零停机升级,将Web服务器逐一从负载均衡上摘除并升级。
  • 在其他工具配合下,进行虚拟机/容器供应(provisioning)。Ansible具有大量的模块可以和EC2, Azure, Digital Ocean, Google Compute Engine, Linode, Rackspace及其他支持OpenStack API的公有云通信。

1.2 Ansible的优势

与同类配置管理工具如Chef、Puppet、Salt相比,Ansible有如下的特点:

1.2.1 易读的语法

用YAML语法编写playbook。Playbook可视为可执行的文档。

1.2.2 远程主机无需安装任何依赖

远程主机只需要安装ssh和Python 2.5+,或者安装simplejson库的Python 2.4+,不需要安装agent或其他软件。

控制主机(用于控制远程主机的那台主机)只需要安装Python 2.6+。

某些Ansible可能需要额外的依赖。

1.2.3 基于推送模式

Ansible默认采用推送模式,从控制主机上把操作推送到远程主机上执行。而Chef、Puppet等配置管理工具则在远程主机上通过agent程序从中心服务器定期拉取配置信息。

通过ansible-pull工具,Ansible也官方支持拉取方式。

1.2.4 同时适用于大规模和小规模集群

用同一个playbook文件处理任意规模的集群。

1.2.5 内置模块

Ansible的配置管理任务全部通过模块来实现。Ansible内置了很多常用模块,同时社区中存在大量的第三方模块。

1.2.6 幂等性

Ansible的模块是声明式的、幂等的。意味着对一个主机多次执行同一个playbook与只执行一次是完全等价的。

1.2.7 非常轻量的抽象层

Ansible无意通过抽象屏蔽操作系统的差异,而是倾向于为不同的操作系统编写不同的playbook。

1.3 运行机制

编写一个文本文件Playbook,描述哪些主机(受控主机)需要配置,以及需要在这些主机上运行的有序任务列表,然后在一台主机(控制主机)上执行这个Playbook。下图表示要在三台Web服务器上面安装nginx:

运行一个Playbook来配置三台Web服务器

根据webservers.yml的配置,Ansible将会做以下的操作:

  1. 生成安装nginx软件包的Python程序
  2. 将此程序复制到Web1、Web2、Web3三台受控主机
  3. 在受控主机Web1、Web2、Web3上执行此程序
  4. 等待该程序在所有主机上执行完成。

说明:

  1. 对于每一个任务,Ansible都是在所有受控主机之间并行执行的。
  2. 在开始下一个任务之前,Ansible会等待所有受控主机都完成上一个任务。
  3. Ansible会按照你指定的顺序来运行任务。

1.4 Ansible开发运行工作流

通常按下面的顺序:

  1. 用inventory文件定义受控主机及其分组。
  2. 用ansible.cfg文件提供受控主机的默认设置,以简化inventory文件。
  3. 用主机变量文件和组变量文件为受控主机和主机分组定义变量,供Playbook和模板文件使用。
  4. 用Playbook文件定义要在受控主机上执行的一系列任务(主要是调用模块执行任务)。
  5. 在控制主机上通过下面的命令运行playbook:

    ansible-playbook -i [inventory file] [playbook file]

    或直接针对指定的受控主机执行ansible命令(没有playbook):

    ansible hostOrGroupNamePattern -m [模块名] -a [模块参数]

  6. 等待Ansible执行完成。