自动化运维工具有很多,从实现的功能、维护的成本、使用的系统来选择,几种常用运维工具比较:
Puppet基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱
SaltStack基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YAML,使得配置脚本更简单
Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用YAML 及 Jinja2模板语言,更强的远程命令执行操作。
so. Ansible!
Ansible介绍与特点
ansible是一款自动化运维工具,基于Python开发,可以实现批量系统设置、批量程序部署、批量执行命令等功能。
特点如下:
Ansible完全基于Python开发,要求python的版本为2.6以上。
Ansible丰富的内置模块,近600个模块完全满足日常功能所需
Ansible默认通过SSH协议管理机器,因此,客户端无需任何配置,管理端配置好后即可使用。
Ansible的应用环境:
应用代码自动化部署
系统管理配置自动化
支持持续交付自动化
支持云计算,大数据平台环境
批量任务执行可以写成脚本,不用分发到远程就可以执行
支持非root用户管理操作,支持sudo
使用python编写,维护更简单
Ansible基本架构
- ansible 核心
- core modules 核心模块:是ansible自带的模块,Ansible模块资源分发到远程节点使其执行特定任务或匹配一个特定的状态。
- custom modeles 扩展模块:如果核心模块不足以完成某种功能,可以添加扩展模块。
- plugins 插件:完成较小型的任务。辅助模块来完成某个功能。
- playbooks 批量任务配置文件:ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行。例如安装一个nginx服务,那么我们可以把这拆分为几个任务放到一个playbook中。例如:第一步需要下载nginx的安装包。第二步我可能考虑需要做的就是将我事先写好的nginx.conf的配置文件下发的目标服务器上。第三步,我们需要把服务启动起来。第四步,我们可能需要检查端口是否正常开启。那么这些步骤可以通过playbook来进行整合,然后通过inventory来下发到想要执行剧本的主机上。
- host inventory 主机群组 定义多种主机:ansible基于连接插件连接到各个主机上,默认是基于SSH连接到目标机器上执行操作的,但是它还支持其他的连接方法,所以需要有连接插件,管理端支持local 、ssh、 paramiko三种方式连接被管理端。
- connection plugins 连接插件 连接远程主机部分:定义ansible管理主机的策略,一般小型环境下只需要在host文件中写入主机的IP地址即可,但是到了中大型环境就需要使用静态inventory或者动态主机清单来生所需要执行的目标主机。
Ansible的任务执行流程
任务执行流程:
按上往下顺序执行:
1) 读取配置:读取ansible的配置文件
2) 抓取被管理的所有机器或分组列表:从主机列表清单(对应hosts文件)
3) 使用host-pattern过滤机器列表:过滤哪些机器做什么操作
4) 根据参数设置执行模块和配置:从modules目录下动态读取或模块,根据模块功能执行对远端主机的操作
5) Runner执行并返回:具体分为两步:Connection环节-定义连接方式、Action阶段-给出机器列表,然后对变量/文件等资源获取
6) 输出,结束:把执行结果反馈会管理端
工作原理:
管理端对远端主机管理(执行命令或脚本),远端主机将执行结果反馈管理端
具体:
首先管理端需要安装ansible工具;
其次配置ansible配置文件(/etc/ansible/ ansible.cfg)和定义被控制的主机或分组列表(/etc/ansible/hosts)并对相关主机变量进行定义;
然后ansible执行模块,将管理端本地执行路径(~/.ansible/tmp)将操作执行(命令或脚本),通过local/ssh/paramiko方式传到远端主机用户目录下(~/.ansible/tmp)并执行;
最后将执行结果反馈至管理端