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:
根据webservers.yml的配置,Ansible将会做以下的操作:
- 生成安装nginx软件包的Python程序
- 将此程序复制到Web1、Web2、Web3三台受控主机
- 在受控主机Web1、Web2、Web3上执行此程序
- 等待该程序在所有主机上执行完成。
说明:
- 对于每一个任务,Ansible都是在所有受控主机之间并行执行的。
- 在开始下一个任务之前,Ansible会等待所有受控主机都完成上一个任务。
- Ansible会按照你指定的顺序来运行任务。
1.4 Ansible开发运行工作流
通常按下面的顺序:
- 用inventory文件定义受控主机及其分组。
- 用ansible.cfg文件提供受控主机的默认设置,以简化inventory文件。
- 用主机变量文件和组变量文件为受控主机和主机分组定义变量,供Playbook和模板文件使用。
- 用Playbook文件定义要在受控主机上执行的一系列任务(主要是调用模块执行任务)。
在控制主机上通过下面的命令运行playbook:
ansible-playbook -i [inventory file] [playbook file]
或直接针对指定的受控主机执行ansible命令(没有playbook):
ansible hostOrGroupNamePattern -m [模块名] -a [模块参数]
等待Ansible执行完成。