概述
Ansible作为新一代的配置管理工具,基于Python开发,以高可读性的yaml语言作为配置语言,实现了批量系统配置、命令执行等强大功能。
Ansible是一个命令行工具,意味着所有操作都必须登录到服务器执行。虽然RedHat提供了Ansible Tower作为Ansible的web管理界面,但Ansible Tower操作比较复杂,且很难与公司自研的运维平台集成,并不是一个很好的选择。目前网上也有不少开源的Ansible Web方案,但基本都是简单地将原本的命令操作转移到页面上,并没有降低操作的复杂性,没有产生什么建设性的意义。
方案演示
为了能够让即使未使用过ansible的人也能自行操作,我设计并开发了执行Ansible Playbook的WEB界面支持,该方案可以集成现有CMDB,用一种非常简单有效的方式来灵活执行playbook完成各种配置部署任务,实现资源和服务的快速交付。方案最终效果演示如下:
系统架构
系统总体架构为:
后台框架:Django
异步任务框架:Celery
前端框架:Bootstrap
所使用的ansible版本为2.6.7,该方案仅依赖原平台的CMDB模块用于获取主机信息,可以很容易修改为其他方式。目前playbook的执行使用的是同步执行,并未用到Celery,用户可根据自己的需要修改为Celery异步的方式来执行。
整个操作界面只有一个页面,页面截图如下:
特点和优势
该方案最有价值的地方在于可以很方便地修改变量并灵活执行playbook组合,并没有过多关注一些次要细节。该方案具有以下特点和优势:
执行Playbook的最小单位为Role(角色),每个Role能独立完成一项配置或部署任务,如环境初始化、安装redis、安装kafka等,且支持单机和集群模式安装。
多个Role可自由组合,能满足各种配置部署需求。
可直接在页面上方便地查看和修改每个Role所涉及的变量,且查看和修改时只显示已勾选的Role的变量。
添加新的Role时,只需在服务器上按照约定编写即可,不需要修改程序代码。
傻瓜式操作,天才式效果,所有变量都有默认值,大部分时候只需鼠标点击即可,只有需要修改变量时才需键盘输入。
playbook设计
该方案基于playbook已经编写好并能成功执行的情况,页面只提供修改变量的功能,并不能修改playbook本身。该方案的一个重点在于playbook的设计,主要体现在三方面:playbook的目录结构设计、变量规划和统一playbook入口。
- playbook目录结构如下:
├── all.yml
├── group_vars
│ └── all
└── roles
├── common
│ ├── files
│ ├── handlers
│ ├── tasks
│ └── templates
├── jdk
│ ├── files
│ ├── handlers
│ ├── tasks
│ └── templates
├── kafka
│ ├── files
│ ├── handlers
│ ├── tasks
│ └── templates
- 所有的变量都在group_vars/all中定义,且应根据实际情况设置不同类型的变量。部分变量定义如下:
#kafka
kafka:
xmx: "1G"
xms: "1G"
port: 9092
name: "common-kafka"
version:
- "2.11-0.10.1.1"
- "2.10-0.8.1.1"
jdk_ver:
- 1.7
- 1.8
ver_index: 0
install_monitor: true
monitor_port: 8989
- 统一playbook入口:ansible只设置一个名为all.yml的playbook,所有的role都包含在这个playbook里,每个role设置一个同名的tag。需要执行特定的role时,通过--tags传入参数来指定。all.yml的内容如下:
---
- hosts: all
become: yes
gather_facts: false
roles:
- role: common
tags: common
- role: nrpe
tags: nrpe
- role: collectd
tags: collectd
- role: confd
tags: confd
- role: monit
tags: monit
- role: jdk
tags: jdk
关键技术点
该方案的关键技术点和流程如下:
打开页面时,后台通过读取all.yml来动态获取所有的Role并返回给页面。
在页面上选中角色并点击“参数”时,后台通过查找该Role目录下所有包含jinja2模板的文件,来获取涉及的所有变量,并以json格式返回给页面。
页面获取到后台返回的json格式变量后,将其转换成表单的形式,以便查看和修改。boolean类型转换成checkbox,list类型转换成下拉列表,string类型转换成文本输入,dict类型则将变量名进行转换后通过递归转换成上述的几种形式。
在页面上选择主机后,点击“执行”,通过serializeArray()方法将表单数据转换成数组,再将数组转成对象,提交到后台。
后台从CMDB查询相应的主机信息并生成临时inventory文件;将参数转换成json格式并生成临时变量文件。
后台直接调用ansible-playbook命令,指定inventory文件、tags以及EXTRA_VARS文件,执行playbook并将结果返回给页面。
总结
该方案实现了通过页面来灵活执行ansible playbook,并将操作复杂度降到最低,让完全不懂ansible的人也能立即上手部署各种服务,大大提升了交付效率,让运维工作在DevOps路上跨出了一大步。