作者介绍
王显宝,汽车之家运维团队成员,主要负责AutoCMS的开发工作和缓存平台的运维工作,擅长python自动化运维,分布式缓存和分布式文件系统应用管理。
汽车之家运维团队,是汽车之家技术部里最为核心的团队,由op和dev共同组成。我们的目标是为汽车之家集团打造一个高性能,高可扩展,低成本,并且稳定可靠的网站基础设施平台。
团队技术博客地址为 http://autohomeops.github.io/
正文
一、前言
AutoCMS 是汽车之家目前正在使用的统一配置管理工具,本文将详细介绍该系统的使用方法和架构实现。
先来回顾下汽车之家软件部署和配置文件管理的经历的几个阶段:
原始阶段(依靠手工部署,wiki制定规范)
软件包的来源没有强制规范,带来了很大的安全隐患。
新业务上线或者业务紧急扩容,运维投入大量人力来完成繁重的体力劳动。
部署目录标准化依赖wiki规范维护,人力部署的时候经常会出现问题
最初阶段软件部署和配置文件管理完全依赖人力完成。部署新业务,运维根据研发测试环境的软件版本,去官网下载软件包,在服务器上编译安装,然后根据研发需求,手工配置文件,启动服务。该阶段暴露出诸多问题:
半自动化阶段(依赖人力打包,yum方式部署)
随着运维自动化的推行,搭建自己的yum源,自己打包来规范软件版本来源和部署目录。需要批量部署的时候,逐台登录服务器执行yum install 安装相关的软件包即可,该阶段已经节省了很大的人力,不过依然需要逐台登录服务器去修改配置文件才能够满足上线需求。配置文件变更前的备份和故障后的恢复依然需要人力维护。
自动化阶段
现在正在使用的管理系统AutoCMS,实现页面化管理软件部署和配置文件,实现快速批量管理软件。
下面将详细介绍一下我们正在使用的AutoCMS。
二、AutoCMS使用方法介绍
AutoCMS 是基于Puppet实现的软件部署和配置文件管理的一套系统,避免手动安装部署软件,提供可靠的软件标准化部署,配置文件和基础服务的管理服务。 本系统主要实现以下几点功能:
批量部署软件包
页面管理软件的配置文件变更,支持备份和回滚
多环境部署,开发,测试,线上环境相互隔离
灰度推送配置
远程执行安全的命令
基本的统计功能
使用者操作流程如下:
创建主机组
主机组是需要批量部署同一个软件或者下发相同配置的主机的集合,创建主机组的同时需要关联一下配置模块,该配置模块是提前写好的puppet模块。
添加主机
将需要部署该模块的主机加入该组内(本系统中主机的输入源是cmdb接口)
选择环境
根据需求选择该主机的环境,各个环境的配置数据独立存储,彼此不受影响。
配置部署参数
根据配置模块不同,编写配置文件,生成不同的配置页面,业务运维只要在页面上选择相应的参数,puppet会根据这些参数生成相应的配置文件。
推送配置
业务运维再前端页面配置完成后,返回主机组管理页面,选择主机并进行推送配置,便会触发相关主机的puppet agent 运行,部署相应的软件和配置。
三、系统架构说明
AutoCMS使用django作为前端框架,后端部署程序主要基于puppet实现,通过puppet的enc和report功能实现完整的部署和配置逻辑,整体架构如下:
简要分析下:
前端配置页面
由于各个软件配置选项不同,所以前端的软件参数配置页面要采用配置文件动态生成。
数据存储
设计初期,我们在mySQL和MongoDB之间选择了MongoDB,主要出于一下几点考虑:
Schema-less,json风格存储:由于配置数据根据软件的不同,其数据不能依靠key-value能够存放的,每个软件的配置项可能会有自定义的结构,所以采用了json格式来处理,而MongoDB的bson恰好能够满足需求,省去了在mysql中频繁使用外键。此外,json格式数据易于掌握和理解,存储的数据一目了然。
CRUD方便快捷,支持范围查询和正则查询,还支持支持upsert选项(如果不存在则插入)。
与其他NoSQL产品相比,我们对mongodb的持久化和高可用方案更加熟悉。
部署实施层
该部分是通过puppet模块实现,模块中引用的参数通过自定义facter或者使用enc来读取配置存储的MongoDB获得,
一台主机的多实例部署通过create_resources函数实现,例如一台主机需配置多个tomcat实例,数据会是如下结构:
多环境分离实现: 本系统中puppet代码部分有git作为版本控制,通过git自身的多分支的特性来做puppet代码层面的环境分离。根据需求来执行不同分支的puppet代码即可。
四、配置案例
下面以tomcat自动部署模块为例,进行详细介绍:
1. 根据部署需求,设计出配置数参数的存储结构
2. 填写前端布局的配置文件,自动生成前端配置页面。
3. 编写puppet自动部署模块。
4. 编写enc转换程序
5.以上准备工作做好之后,系统上线,运维可以创建主机组,关联tomcat模块,将需要批量部署的主机加入该组内,并进行参数配置
6. 配置完成后,进行灰度发布验证没问题后,进行全量推送,观察状态,配置完成。
五、小结
随着云时代的到来,很多服务器可以定制镜像实现所需的运行环境,不过随着业务规模的扩大,服务器的个性化配置会越来越多,镜像的维护工作也会逐步增加,使用AutoCMS可以灵活的解决这个问题。把各自的配置需求写成配置模块,并把服务器分组,批量推送下去,可以节省运维人员很多体力劳动。让运维人员将精力投入到更有价值的工作中。
欢迎加入本博客公开兴趣群软件开发技术群兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流QQ群:26931708
Hadoop源代码研究群兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转HadoopQQ群:288410967