我的新手游项目很快就要进入到寻找发行商的环节,最近几天相对较空闲,逐将工作重心转移到服务器组运维工具的制作上.
回想一年之前经历的那个不算成功的端游项目,因为运维工具设计得不合理,使用十分不方便,游戏上线之后搞得我焦头烂额的.

之前一直没碰过web相关的技术,最近几天猛看了下php和javascript相关的东西,逐决定用web的方式实现一套游戏服务器的运维和gm管理工具.
这个系统的目标:

  • 按逻辑和物理机器的方式管理服务(包括监控,启动,关闭等)
  • 当机器或服务出现异常的时候自动向预先设定的邮件地址发送邮件
  • 控制目标机器执行版本升级任务
  • 提供gm管理工具以方便运维人员查看游戏的运行状况,发送游戏公告等.

下面是这套系统雏形的两个截图:

这两张截图展示的是服务器的管理界面.左边是一个有两个标签的树形控件.第一个标签是物理视图,第二个是逻辑视图.右边是监控界面和3个控制按扭.
监控界面按用户在左边选择的节点来展示监控信息.例如如果用户选择的是物理视图中的一个根节点,如192.168.0.87.则右边的界面上就会显示目标机器的状态以及运行在目标机器上进程的状态.而控制按扭则分别用于启动/关闭/强杀一个或一组服务.

下面简单的介绍下系统的实现.

首先所有的监控数据,管理系统的用户及权限数据,服务器配置数据都被保存到一台中央ssdb服务上.

每台物理机器运行一个daemon服务,每隔一秒收集机器状态信息和上面运行的服务信息并将信息发送到中心ssdb服务上.同时daemon上启动一个简单的http服务,用于处理发送到这台机器上的操作请求.

下面是daemon的代码:

local Sche = require "lua.sche"
local Redis = require "lua.redis"
local Cjson = require "cjson"local deployment={{groupname="central",service={{type="ssdb-server",logicname="ssdb-server",conf="ssdb.conf",ip="192.168.0.87"},}},{groupname="group1",service={{type="groupserver",logicname="groupserver",ip="192.168.0.87",port="8010"},{type="gameserver",logicname="gameserver",ip="192.168.0.87",port="8011"},{type="gateserver",logicname="gateserver",ip="192.168.0.87",port="8012"},}},  {groupname="group2",service={{type="groupserver",logicname="groupserver",ip="192.168.0.88",port="8010"},{type="gameserver",logicname="gameserver",ip="192.168.0.88",port="8011"},{type="gateserver",logicname="gateserver",ip="192.168.0.88",port="8012"},}},
}local function split(s,separator)local ret = {}local initidx = 1local spidxwhile true dospidx = string.find(s,separator,initidx)if not spidx thenbreakendtable.insert(ret,string. sub(s,initidx,spidx-1))initidx = spidx + 1endif initidx ~= string.len(s) thentable.insert(ret,string. sub(s,initidx))endreturn ret
endlocal err,toredis = Redis.Connect("127.0.0.1",6379,function () print("disconnected") end)
if not err thentoredis:Command("set deployment " .. Cjson.encode(deployment))AddTopFilter("distrilua")AddTopFilter("ssdb-server")while true dolocal machine_status = Top()print(machine_status)local tb = split(machine_status,"\n")local machine = {}local i = 1while i <= #tb doif tb[i] ~= "process_info" thentable.insert(machine,tb[i])elsei = i + 1   breakendi = i + 1endlocal process = {}while i <= #tb doif tb[i] ~= "" thenlocal tmp = {}local cols = split(tb[i],",")for k,v in pairs(cols) dolocal keyvals = split(v,":")tmp[keyvals[1]] = keyvals[2];endtable.insert(process,tmp)endi = i + 1   endlocal str = string.format("hmset MachineStatus 192.168.0.87 %s",CBase64.encode(Cjson.encode({machine,process})))toredis:Command(str)--toredis:Command("set machine " .. CBase64.encode(Cjson.encode(machine)))--toredis:Command("set process " .. CBase64.encode(Cjson.encode(process)))          Sche.Sleep(1000)end
elseExit()
end

daemon服务运行在distri.lua环境之上,所以是用lua编写的.

这段代码首先定义了一个叫做deployment的lua表,这个表就是服务器组的逻辑和物理配置信息.这个配置表将会被转换成json字符串并保存到ssdb的deployment字段中.之后尝试连接ssdb服务,如果连接成功则添加两个信息收集的过滤器ssdb-serverdistrilua添加了这两个过滤器之后每轮循环调用Top函数收集信息的时候就只会收集进程名为ssdb-serverdistrilua的进程的信息.收集到数据之后经过一些处理然后转换成json字符串接着保存到ssdb的MachineStatus相关对象的ip下面.

http相关的处理在这里尚未实现所以暂时不介绍.

接下来是manage.php,这个是用户控制界面的文件.这个文件使用了名为webix的js ui库.

        function fetchdata(){createXMLHttpRequest();var url="info.php";xmlHttp.open("GET",url,true);xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");        xmlHttp.onreadystatechange = callback;xmlHttp.send(null);}function callback(){if(xmlHttp.readyState == 4){if(xmlHttp.status == 200){var info = JSON.parse(xmlHttp.responseText);var deploydata = info.deployment;var machinedata = info.machine_status;                                                              if(firstrun){webix.message("first");buildDeployPhyTree(deploydata);buildPhyTree(machinedata);buildPhyView(); buildDeployLogTree(deploydata);buildLogicalTree();buildLogView();}else{buildPhyTree(machinedata);buildLogicalTree();updatePhyView();updateLogView();}ShowStatus();               firstrun = false;setTimeout("fetchdata()",1000);}}}

这个文件的关键部分是这两个函数,fetchdata用于向服务器请求数据.这个请求被发往info.php页面.数据受到之后在callback中将数据转换成json对象然后根据数据构建视图.最后设置一个1秒钟的超时,超时之后继续向服务器请求数据.

接下来我们看下info.php:

<?php
header("cache-control:no-cache,must-revalidate");
header("Content-Type:text/html;charset=utf8");function split_line($input,$separator){$ret = array();$line = strtok($input,$separator);while($line != ""){array_push($ret,$line);$line = strtok($separator);}return $ret;
}
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$deployment = $redis->get('deployment');
$machine_status = $redis->hGetAll('MachineStatus');
$outputstr = "{\"deployment\":$deployment,\"machine_status\":[";
$first = true;
while(list($ip,$info) = each($machine_status)){if($first){$first = false;}else{$outputstr = $outputstr + ",";}$outputstr = $outputstr . "{\"ip\":\"$ip\",\"status\":" . base64_decode($info) . "}";
}
$outputstr = $outputstr . "]}";
echo $outputstr;
?>

处理相当简单,受到请求后向ssdb请求数据,然后将数据组合成一个json字符串返回给客户端.

感兴趣的朋友可以关注https://github.com/sniperHW/distri.lua,在examples目录下找到相关的文件.

转载于:https://www.cnblogs.com/sniperHW/p/4141139.html

distri.lua的web运维工具相关推荐

  1. python开发web运维工具_Python web 开发工具箱

    工欲善其事,必先利其器(装逼工具)Pycharm.专业的python IDE,功能很强大,特别喜欢它的代码merge工具,不想被编辑器折腾死的推荐直接使用,五星级推荐.(除了内存占用大点) vim.本 ...

  2. python开发web运维工具_【实战小项目】python开发自动化运维工具--批量操作主机...

    有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子.只不过,很多运维同学学习Python之后,苦于没小项目训练,本篇演示用Python写一个批量操作主机的工具 ...

  3. Conmi的正确答案——linux/ubuntu安装web运维工具(Cockpit)

    系统版本:Ubuntu server 20.04 # 想安装K8S,但fedora缺少一些指令,所以想改回Ubuntu,Ubuntu却没有fedora的web操作界面, # 后来找了一圈才找到这个:C ...

  4. 简单介绍自动化运维工具clip

    Clip是一款自动化运维工具,适用于海量服务器的管理场景,可以降低系统误操作风险,提高工作效率等.Clip将传统的IP管理纬度替换为String管理纬度,管理方式的改变使海量运维时更加的便捷.可靠与高 ...

  5. mysql 自动化运维工具_MySQL使用工具Inception实现自动化运维

    MySQL使用工具Inception实现自动化运维 发布时间:2020-05-27 17:11:14 来源:51CTO 阅读:180 作者:三月 下面一起来了解下MySQL使用工具Inception实 ...

  6. Ansible自动化运维工具介绍

    介绍 Ansible自动化运维工具,是基于Python开发的,可以实现批量系统配置,批量程序部署.批量运行命令等等. ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ans ...

  7. Python自动化运维工具-Fabric部署及使用总结

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  8. Ansible自动化运维工具使用

    概述 本文描述自动化运维工具 Ansible 的安装及基础使用方法,包含: Centos 下的安装 主机配置 Ad-Hoc command(命令行执行) Playbook (任务剧本) Ansible ...

  9. 自动化运维工具——ansible安装及模块介绍

    ansbile 前言 一.主流自动化运维工具简介 1.1 Puppet 1.2 Saltstack 1.3 Ansible 二.Ansible 运维工具原理 三.Ansible安装 3.1 下载软件包 ...

  10. 云计算论文集, Spark, 数据描述语言, 运维工具集

    https://antkillerfarm.github.io/ 云计算论文集 这里列出一些在这个领域产生重大影响的论文.仅作备忘,肯定不全,Google是其中的绝对主力. CAP <Towar ...

最新文章

  1. 最新技术选型解决方案列表
  2. python汉字编码错误_python解决汉字编码问题:Unicode Decode Error
  3. 黄聪:C# MP3操作类,能播放指定的mp3文件,或播放嵌入的资源中的Mp3文件
  4. 【Java Web前端开发】TomcatServlet基础
  5. python 惰性_Python学习---django惰性机制
  6. CSS+js弹出居中的背景半透明div层
  7. stm8s003程序跑飞_微信小程序只玩跳一跳?OUT啦!带你玩更好玩的微信小游戏!...
  8. LeetCode 1155. 掷骰子的N种方法(DP)
  9. jdbc Illegal value for setFetchSize()
  10. C# 编程规范 (coding standard)
  11. 大数据可视化有哪些作用和优点
  12. OC Gen X Mac(一键制作黑苹果OpenCore EFI文件)v最新版
  13. 如何看Spring源码
  14. java 读写acr122u_使用ACR122U NFC读卡器对M1卡进行读写操作(可以读写中文)
  15. R 语言从Github上安装R语言的程序包
  16. 计算机电子贺卡制作圣诞节,如何制作电子圣诞贺卡?贺卡制作步骤
  17. Visual SourceSafe 2005介绍
  18. Tableau仪表板制作
  19. LeetCode 37. 解数独 Sudoku Solver
  20. Cadence Allegro设置区域规则

热门文章

  1. 最长递增子序列和双序列
  2. MS SqL2000 数据库置疑状态的解决方法[转]
  3. 服务器应用程序不可用解决方案集
  4. 维特比算法(Viterbi Algorithm)
  5. mac电脑更新后,如何解决mac在文件夹中无权限新建文件?
  6. sip系统完整性是什么?SIP系统完整性保护关闭方法(含M1)
  7. Centos 7 配置 apache https访问以及Chrome 忽略证书错误继续
  8. Android模拟器下安装APP报INSTALL_FAILED_NO_MATCHING_ABIS错误解决方案
  9. asp.net后台操作javascript:confirm返回值
  10. android开发——图文并茂