Break Wang bio photo

Break Wang

Be slow to promise and quick to perform.

Email Twitter Google+

介绍

  • 作者介绍

    本文作者是王显宝autohomeops@autohome.com.cn,主要负责AutoCMS的开发工作和缓存平台的运维工作,擅长python自动化运维,分布式缓存和分布式文件系统应用管理。

  • 团队介绍

    我们是汽车之家运维团队,是汽车之家技术部里最为核心的团队,由op和dev共同组成。我们的目标是为汽车之家集团打造一个高性能,高可扩展,低成本,并且稳定可靠的网站基础设施平台。

    团队技术博客地址为 http://autohomeops.corpautohome.com

  • 联系方式:可以通过邮件或者在官方技术博客留言跟我们交流。

大纲

1.前言

AutoCMS 是汽车之家目前正在使用的统一配置管理工具,本文将详细介绍该系统的使用方法和架构实现。 先来回顾下汽车之家软件部署和配置文件管理的经历的几个阶段:

  • 原始阶段(依靠手工部署,wiki制定规范)
    • 最初阶段软件部署和配置文件管理完全依赖人力完成。部署新业务,运维根据研发测试环境的软件版本,去官网下载软件包,在服务器上编译安装,然后根据研发需求,手工配置文件,启动服务。该阶段暴露出诸多问题:
      • 软件包的来源没有强制规范,带来了很大的安全隐患。
      • 新业务上线或者业务紧急扩容,运维投入大量人力来完成繁重的体力劳动。
      • 部署目录标准化依赖wiki规范维护,人力部署的时候经常会出现问题
  • 半自动化阶段(依赖人力打包,yum方式部署)
    • 随着运维自动化的推行,搭建自己的yum源,自己打包来规范软件版本来源和部署目录。需要批量部署的时候,逐台登录服务器执行yum install 安装相关的软件包即可,该阶段已经节省了很大的人力,不过依然需要逐台登录服务器去修改配置文件才能够满足上线需求。配置文件变更前的备份和故障后的恢复依然需要人力维护。
  • 自动化阶段
    • 现在正在使用的管理系统AutoCMS,实现页面化管理软件部署和配置文件,实现快速批量管理软件。

下面将详细介绍一下我们正在使用的AutoCMS。

2.AutoCMS使用方法介绍

AutoCMS 是基于puppet实现的软件部署和配置文件管理的一套系统,避免手动安装部署软件,提供可靠的软件标准化部署,配置文件和基础服务的管理服务。 本系统主要实现以下几点功能:

  • 批量部署软件包
  • 页面管理软件的配置文件变更,支持备份和回滚
  • 多环境部署,开发,测试,线上环境相互隔离
  • 灰度推送配置
  • 远程执行安全的命令
  • 基本的统计功能
使用者操作流程如下:

  1. 创建主机组

    主机组是需要批量部署同一个软件或者下发相同配置的主机的集合,创建主机组的同时需要关联一下配置模块,该配置模块是提前写好的puppet模块。

  2. 添加主机

    将需要部署该模块的主机加入该组内(本系统中主机的输入源是cmdb接口)

  3. 选择环境

    根据需求选择该主机的环境,各个环境的配置数据独立存储,彼此不受影响。

  4. 配置部署参数

    根据配置模块不同,编写配置文件,生成不同的配置页面,业务运维只要在页面上选择相应的参数,puppet会根据这些参数生成相应的配置文件。

  5. 推送配置

    业务运维再前端页面配置完成后,返回主机组管理页面,选择主机并进行推送配置,便会触发相关主机的puppet agent 运行,部署相应的软件和配置。

3.系统架构说明

AutoCMS使用django作为前端框架,后端部署程序主要基于puppet实现,通过puppet的enc和report功能实现完整的部署和配置逻辑,整体架构如下:

简要分析下:

  • 前端配置页面
    • 由于各个软件配置选项不同,所以前端的软件参数配置页面要采用配置文件动态生成。
  • 数据存储
    • 设计初期,我们在mysql和MongoDB之间选择了MongoDB,主要出于一下几点考虑:
      1. Schema-less,json风格存储:由于配置数据根据软件的不同,其数据不能依靠key-value能够存放的,每个软件的配置项可能会有自定义的结构,所以采用了json格式来处理,而MongoDB的bson恰好能够满足需求,省去了在mysql中频繁使用外键。此外,json格式数据易于掌握和理解,存储的数据一目了然。

        1. CRUD方便快捷,支持范围查询和正则查询,还支持支持upsert选项(如果不存在则插入)。

        2. 与其他nosql产品相比,我们对mongodb的持久化和高可用方案更加熟悉。

  • 部署实施层

    该部分是通过puppet模块实现,模块中引用的参数通过自定义facter或者使用enc来读取配置存储的MongoDB获得,

    • 多实例部署的实现:

    一台主机的多实例部署通过create_resources函数实现,例如一台主机需要配置多个tomcat实例,数据会是如下结构:

    • 多环境分离实现: 本系统中puppet代码部分有git作为版本控制,通过git自身的多分支的特性来做puppet代码层面的环境分离。根据需求来执行不同分支的puppet代码即可。

4.配置案例

下面以tomcat自动部署模块为例,进行详细介绍:

  1. 根据部署需求,设计出配置数参数的存储结构
  2. 填写前端布局的配置文件,自动生成前端配置页面。

  3. 编写puppet自动部署模块。
  4. 编写enc转换程序
  5. 以上准备工作做好之后,系统上线,运维可以创建主机组,关联tomcat模块,将需要批量部署的主机加入该组内,并进行参数配置
  6. 配置完成后,进行灰度发布验证没问题后,进行全量推送,观察状态,配置完成。

5. 小结

随着云时代的到来,很多服务器可以定制镜像实现所需的运行环境,不过随着业务规模的扩大,服务器的个性化配置会越来越多,镜像的维护工作也会逐步增加,使用AutoCMS可以灵活的解决这个问题。把各自的配置需求写成配置模块,并把服务器分组,批量推送下去,可以节省运维人员很多体力劳动。让运维人员将精力投入到更有价值的工作中。

更多精彩技术文章,欢迎大家访问汽车之家系统平台团队博客http://autohomeops.corpautohome.com

简历请发送autohomeops@autohome.com.cn, 期待你的加入!