美文网首页编程开发自动化运维
通过web界面来灵活执行ansible playbook的一种精

通过web界面来灵活执行ansible playbook的一种精

作者: Markus_17bc | 来源:发表于2019-11-20 16:39 被阅读0次

概述

Ansible作为新一代的配置管理工具,基于Python开发,以高可读性的yaml语言作为配置语言,实现了批量系统配置、命令执行等强大功能。

Ansible是一个命令行工具,意味着所有操作都必须登录到服务器执行。虽然RedHat提供了Ansible Tower作为Ansible的web管理界面,但Ansible Tower操作比较复杂,且很难与公司自研的运维平台集成,并不是一个很好的选择。目前网上也有不少开源的Ansible Web方案,但基本都是简单地将原本的命令操作转移到页面上,并没有降低操作的复杂性,没有产生什么建设性的意义

方案演示

为了能够让即使未使用过ansible的人也能自行操作,我设计并开发了执行Ansible Playbook的WEB界面支持,该方案可以集成现有CMDB,用一种非常简单有效的方式来灵活执行playbook完成各种配置部署任务,实现资源和服务的快速交付。方案最终效果演示如下:

image

系统架构

系统总体架构为:

  • 后台框架:Django

  • 异步任务框架:Celery

  • 前端框架:Bootstrap

所使用的ansible版本为2.6.7,该方案仅依赖原平台的CMDB模块用于获取主机信息,可以很容易修改为其他方式。目前playbook的执行使用的是同步执行,并未用到Celery,用户可根据自己的需要修改为Celery异步的方式来执行。

整个操作界面只有一个页面,页面截图如下:

image

特点和优势

该方案最有价值的地方在于可以很方便地修改变量并灵活执行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

关键技术点

该方案的关键技术点和流程如下:

  1. 打开页面时,后台通过读取all.yml来动态获取所有的Role并返回给页面。

  2. 在页面上选中角色并点击“参数”时,后台通过查找该Role目录下所有包含jinja2模板的文件,来获取涉及的所有变量,并以json格式返回给页面。

  3. 页面获取到后台返回的json格式变量后,将其转换成表单的形式,以便查看和修改。boolean类型转换成checkbox,list类型转换成下拉列表,string类型转换成文本输入,dict类型则将变量名进行转换后通过递归转换成上述的几种形式。

  4. 在页面上选择主机后,点击“执行”,通过serializeArray()方法将表单数据转换成数组,再将数组转成对象,提交到后台。

  5. 后台从CMDB查询相应的主机信息并生成临时inventory文件;将参数转换成json格式并生成临时变量文件。

  6. 后台直接调用ansible-playbook命令,指定inventory文件、tags以及EXTRA_VARS文件,执行playbook并将结果返回给页面。

总结

该方案实现了通过页面来灵活执行ansible playbook,并将操作复杂度降到最低,让完全不懂ansible的人也能立即上手部署各种服务,大大提升了交付效率,让运维工作在DevOps路上跨出了一大步。

相关文章

网友评论

    本文标题:通过web界面来灵活执行ansible playbook的一种精

    本文链接:https://www.haomeiwen.com/subject/ntnoictx.html