一、概述
转转服务器侧的环境维护程序,简单可以理解为agent+cmd工作模式。Agent承上的任务是完成与平台远程命令和调度的交互,启下的任务是完成参数处理和对注册的命令执行具体的维护脚本。Cmd是完成在服务器上具体的操作,并对执行的过程、结果进行控制、标记。
CMD = script+module+config+util+console 五个主要的模块组成。每个模块具体功能介绍如下:
1、script模块是环境操作的核心部分,包括同步、部署、初试化、回收、授权、监控、删除、调度和依赖更新等脚本,目前有18个。
2、module模块是环境操作的通用性的功能插件,包括替换、检查、callback等。
3、config模块是基础配置、常量模块。
4、util工具模块,包括shell、ftp、falcon、nginx、http、mail等功能和模块操作的封装。
5、console模块是python版的linux环境的工程命令菜单工具。
整体模块目录树和其他模块说明
二、script设计
传统的环境维护脚本存在一些常见的问题:
多用shell/bash编写,初期方便,但是后期维护成本高,代码不易读。
随着业务变化和增长,逻辑条件越来越复杂,修改成本变大不友好。
问题定位困难,不太方便添加执行记录日志,调试模式简陋。
变更修改难度大,上下游逻辑和变量难以控制,耦合严重。
从语言选型上,果断放弃之前的shell选用python。
代码量行数变少,更直观。
更新和维护速度变快。
执行速度变快,过程可以追溯和记录。
重点介绍一下环境维护脚本做的几处优化设计:
1、执行列表拼装
线性脚本最大的问题是,流程一旦固化,执行的逻辑和顺序改动起来就有具体的成本。为了解决这个问题,设计将script执行的步骤列表化,在列表中可以随时删除、添加或者改变执行顺序。不需要强行加入逻辑或者注释、删除代码。
执行步骤列表
在todolist中具有明显界限的逻辑步骤被分割开,函数化,然后根据需要随时可以进行拼装、拆卸。在CMD基类中对执行方法使用了Python反射机制,对列表步骤进行执行。
反射执行列表
2、终止回调
脚本的执行经常会出现一个比较大的问题,异常中断。由已知或者未知的情况都可能导致。而异常中断会造成问题定位困难,下游操作无法执行,状态夯死。
比如举个例子,一个集群名称的不规范(意向不到),导致代码没考虑到这种情况,直接报出语言的exception,程序异常中断。但是这种异常中断是非预期的,导致后续必要的操作没有执行,比如标记结果,比如输出执行日志等。
(1)、通过try去捕获代码块异常。范围有限。
(2)、使用python的atexit库,实现结束回调,不管是正常亦是不正常的结束,都必须要需要做某些事情,执行更为优雅。
完成回调的注册
三、module设计
在环境维护的脚本中,会遇到很多的公共和通用化的服务组件,本身和维护脚本逻辑不耦合,只是完成特定的功能。
这类功能又区别于简单工具类,因为会随着实际业务的需要不断的进行扩展。想到就是插件化实现。目前应用到三个地方:
1、用户身份检测策略
2、替换策略
3、检查策略
每个都实现了单独的插件类。
(1)、插件引用的地方:
构造插件对象
(2)、配置项的策略级别
通过不同的策略级别保证,一旦命中策略,后续采取的处理结果是什么样的
(3)、具体的替换策略
根据目录递归文件,名中策略逐行替换
四、util设计
常用服务和工具的命令操作我们统一放在util模块中实现。
比如nginx服务的操作,会对nginx的安装、配置文件替换、服务状态检测、进程获取、启动、停止、重启、授权等操作进行封装。方便在维护脚本中调用。
这里给大家举两个当时util工具设计的例子。
1、工具安装的交互操作问题实现,通过except脚本辅助完成。
不是所有事情python都能搞掂,但是python可以和其他脚本语言做很好的粘合。
2、实时日志的实现
通过日志偏移量实现
获取日志文件的当前目录,轮询日志的偏移量,tail
偏移量日志,获取增量的日志文件内容。
五、console设计
集成式的服务端侧可视化的命令菜单工具,Shell终端简化版的类PC页面工具。PS:研发同学非常喜欢
1、不脱离服务器完成环境操作,效率很高
2、交互式的操作方式,执行更友好
3、支持翻页查询等功能,可以随意在各种操作中进行切换。
比如在环境中执行【zz】命令,就换唤起控制台完成执行的操作。
领取专属 10元无门槛券
私享最新 技术干货