1.1 简介
Ansible 是一个配置管理和应用部署工具,功能类似于目前业界的配置管理工具 Chef、Puppet、Saltstack。Ansible 是通过 Python 语言开发。
Ansible 默认通过 SSH 协议管理机器,所以 Ansible 不需要安装客户端程序在服务器上。
Ansible 可以实现以下目标:
- 自动化部署应用
- 自动化管理配置
- 自动化的持续交付
- 自动化的(AWS)云服务管理
- …
1.2 Ansible特性:
- no agents:不需要在被管控主机上安装任何客户端;
- no server:无服务器端,使用时直接运行命令即可;
- modules in any languages:基于模块工作,可使用任意语言开发模块;
- yaml,not code:使用yaml语言定制剧本playbook;
- ssh by default:基于SSH工作;
- strong multi-tier solution:可实现多级指挥。
1.3 Ansible总体架构:
上图为ansible的基本架构,从上图可以了解到其由以下部分组成:
- 核心:ansible
- 核心模块(Core Modules):这些都是ansible自带的模块
- 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
- 插件(Plugins):完成模块功能的补充
- 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
- 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
- 主机群(Host Inventory):定义ansible管理的主机
1.4 基于模块的设计
Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
- 连接插件connection plugins:负责和被监控端实现通信;
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- 各种模块核心模块、command模块、自定义模块;
- 借助于插件完成记录日志邮件等功能;
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
1.5 工作原理
以上是ansible工作原理图,两张图基本都是在架构图的基本上进行的拓展。从上面的图上可以了解到:
- 管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
- 可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
- 管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
1.6 ansible 执行流程
Ansible在运行时, 首先读取 ansible.cfg
中的配置, 根据规则获取Inventory
中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
1.7 ansible 命令执行过程
a) 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
b) 查找对应的主机配置文件,找到要执行的主机或者组;
c) 加载自己对应的模块文件,如 command;
d) 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
e) 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
f) 给文件 +x 执行权限;
g) 执行并返回结果;
h) 删除临时py文件,sleep 0退出;