如何实现服务器的批量自动发布

时间:2022-01-05 12:29:04

目前我们每次版本发布时大致流程为停所有服务器war刷数据库脚本启动所有服务器。整个流程经常因为数据库脚本有误、操作员不熟悉操作规范、 安全策略要求使用堡垒机逐个登录各服务器操作等原因而导致发布过程漫长,我们需要开发实现一个自动发布的工具,当进行版本发布时,先将war包、数据库脚 本等上传至服务器指定目录后,操作员可以通过浏览器访问一个页面,输入后续操作需要的用户名密码(如刷数据库脚本时需要的数据库用户名密码)、然后通过傻瓜式的发布向导指引操作员"是否停止服务器"、点击下一步按钮"是否开始上传war"、再点击下一步按钮"是否开始刷数据库脚本"等。每一步都实现程序自动控制,并且每一步操作都有提示结果返回,以便在操作员发现自动程序出错时改为手动执行,直到整个发布过程结束。

 

总体设计方案:

1、 整个软件架构为:一个部署在某台服务器上的HTTP Server作为总控的客户端,在生产环境各应用服务器上各部署一个简化的HTTP Server作为服务器端。客户端作为Web服务器向操作员提供web操作界面,并接收操作员指令向各服务器端发送命令请求,服务器端执行命令后返回结果,在客户端将其显示以便操作员掌握指令执行情况。

2、 客户端为JSP+Java Bean架构,JDK版本1.5,须运行在J2EE容器之上,可通过部署一个Tomcat或者在应用中内嵌Jetty实现。

3、 服务器端执行客户端的指令请求是通过Java调用本地Shell脚本实现的,并接收脚本执行的输出内容返回客户端。

4、该次版本实现各服务器仅实现停止、启动和重启Weblogic各节点的指令;向数据库刷脚本的操作是由客户端通过调用本地的Oracle客户端实现。

 

页面设计方案:

1、 首页为登录页,有一个密码输入框需要输入密码并点击确认按钮进行登录后才能进行后续操作。2、 成功登录后进入一个框架页面,左侧为解析XML配置文件得到的步骤菜单树,右侧为步骤执行的操作界面和执行结果返回的信息显示界面。

3、 左侧菜单树中已经执行过的步骤用特殊图标或打勾符号表示,并提供“清除已完成步骤提示”的按钮。

4、 右侧页面提供<上一步><确认执行><下一步>按钮,分别表示返回上一步骤、确认执行当前步骤、跳转到下一步骤页面。

5、 点击确认执行按钮执行命令后,该步骤状态即为完成,但由于执行结果返回信息包括各种情况,程序无法逐一确认是否正确执行,须操作人员根据执行命令的返回结果信息自行判断,如果成功执行,操作员可点击<下一步>按钮进入下一步骤。

6、 第一步页面上隐藏<上一步>按钮,所有步骤执行完毕后,隐藏<下一步>按钮。

7、 操作员可通过上一步、下一步按钮到准备操作的步骤页面,也可以通过点击左侧菜单树上的链接跳转到相应页面。

逻辑控制处理主要依赖于配置文件控制:

<?xml version="1.0" encoding="UTF-8"?>
<commander>
 <!-- 登录客户端操作的密码,经过MD5加密 -->
 <client password="6B4B7EDEC50234CBD1AA5FD719A9229C" />
 <!-- 服务器IP端口,备注用于显示在页面 -->
 <servers>
 <server ip="10.xxx.xx.xx" port="8888" remark="主应用服务器10.xxx.xx.xx"/>
 <server ip="10.xxx.xx.xx" port="8888" remark="报表服务器10.xxx.xx.xx"/>
 <server ip="10.xxx.xx.xx" port="8888" remark="批处理服务器10.xxx.xx.xx"/>
 </servers>
 <!-- 所有操作步骤配置 -->
 <commands-step>
 <!--
 type:表示是远程HTTP连接服务器还是调用本地Shell执行
 title:用于显示在步骤菜单和步骤标题上的文字信息
 script-path:为shell脚本存放路径,当type为远程http时,script-path的值将拼接在URL之后
 page:用于步骤菜单上点击时跳转到的页
 remark: 该步骤页面上显示的对这一步骤的详细说
 param:仅type为local-shell时生效,为须传给shell脚本的参数,以'$变量名'方式表示
 log-file:仅在type为local-shell时生效,为本地shell脚本执行后生成的日志文件路径
 -->
 <commands step="1" type="remote-http" title="停止所有服务器" script-path="/stopall" page="/step/remotecmd.jsp?step=1"
  remark="停止所有应用服务器上WebLogic实例" />
  <commands step="2" type="local-shell" title="刷数据库脚本" page="javascript:void(0);">
   <command-step step="2.1" title="脚本导入主库" page="/step/dbuserpasswd.jsp?step=2.1" remark="">
    <command step="2.1.1" title="初始化脚本" script-path="~/execsql.sh" page="/step/localcmd.jsp?step=2.1.1"
    param="$username $password /cpic/jtpttm/nasFiles/deployscript/XXX/preload.sql" log-file="" remark=""/>
    <command step="2.1.2" title="备份存储过程和函数" script-path="~/execsql.sh" page="/step/localcmd.jsp?step=2.1.2"
     param="$username $password /cpic/jtpttm/nasFiles/deployscript/XXX/backup.sql" log-file="" remark=""/>
    <command step="2.1.3" title="DDL语句" script-path="~/execsql.sh" page="/step/localcmd.jsp?step=2.1.3"
    param="$username $password /cpic/jtpttm/nasFiles/deployscript/XXX/DBupdate.sql" log-file="" remark=""/>
    <command step="2.1.4" title="刷存储过程" script-path="~/execsql.sh" page="/step/localcmd.jsp?step=2.1.4"
    param="$username $password /cpic/jtpttm/nasFiles/deployscript/XXX/SP_FUNupdate.sql" log-file="" remark=""/>
    <command step="2.1.5" title="编译存储过程" script-path="~/execsql.sh" page="/step/localcmd.jsp?step=2.1.5"
    param="$username $password /cpic/jtpttm/nasFiles/deployscript/XXX/SP_Compile.sql" log-file="" remark=""/>
    <command step="2.1.6" title="DML语句" script-path="~/execsql.sh" page="/step/localcmd.jsp?step=2.1.6"
    param="$username $password /cpic/jtpttm/nasFiles/deployscript/XXX/DBupdate.sql" log-file="" remark=""/>
   </command-step>
   <command-step step="2.2" title="脚本导入报表库" page="/step/dbuserpasswd.jsp?step=2.2" remark="">
   </command-step>
   <command-step step="2.3" title="脚本导入日志库" page="/step/dbuserpasswd.jsp?step=2.3" remark="">
   </command-step>
  </commands>
  <commands step="3" type="remote-http" title="启动所有服务器" script-path="/startall" page="/step/remotecmd.jsp?step=3"
  remark="启动所有应用服务器上WebLogic实例" />
  </commands-step>
 </commander>

 

感兴趣的朋友,欢迎一起讨论