基于Thrift的远程管理架构

经过几个月的规划的施工,目前WEB自动化运维系统已经初见规模了,当然虽然是Web自动化运维系统,但究其根本还是一套远程管理系统,因为目前业务主要管理的是windows机器,所以整个系统使用C#来进行的编写,但也是有部分业务是跑在Linux下的,后续还会增加Linux的支持,虽然已经到内部的3.0版本,但目前项目还在初期阶段,整体的架构还存在很大的完善空间,目前项目还没有进行开源化,待管理界面确定后将会对其进行开源。

系统架构

WOS:WebOpsServer :WEB运维自动化系统服务端

WOC:WebOpsClient :WEB运维自动化系统客户端

WOM:WebOpsModule :WEB运维自动化系统模块

系统时序

手动检测

主要用于主动发送指令,主要用于手动触发节点机上指令,如执行**Nginx配置文件同步,DNS**同步或对服务器进行单项业务检测

触发检测

通过服务端进行事件触发,执行客户端指令

自助检测

依靠节点机自身时钟,进行定时任务,通过已经预设的定时任务

系统通讯

通讯协议是整个项目的核心组成部分,整套系统的交互基于Client端的指令接收器与Server端的异步返回处理器实现,数据传输部分仅存在两个结构体 ,即命令发送结构体与命令回收结构体

结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct instruct{
1 : string instruct,
2 : string id,
3 : map<string,string> param
}
//命令回收结构体
struct reinstruct{
1 : string instruct,
2 : string id,
3 : string ip,
4 : string memo
}
//客户端服务
service InstructionInvokeService{
//指令接收器
list<reinstruct> instructionInvoke(1: list<instruct> instruct)
}
//服务端服务
service ServerService{
//异步返回结果
string DataTransport(1:reinstruct reinstruct)
}

模块开发

代码开发

本项目已经做好的模块的Demo,在开发模块前需要先进行Demo的初始化工作

1、 复制一份新的WebOpsModuleDemo ,命名成WebOpsModule_{模块名称},并将工程WebOpsModuleDemo.csproj重命名为WebOpsModule_{模块名称}.csproj

2、 在VS2015中导入项目

3、 修改基础信息

a) Log4NET配置文件名称

b) AssemblyInfo基础信息

c) 项目属性

修改完成后即可开始编程了,Webops模块开发需要分为Server模块与Client模块,在开发时需要全部实现,Client一般是先客户机上的逻辑,Server段一般实现回收后的数据处理(入库等)

Client 端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ClientService{
public static log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
/*
reinstruct reins:
instruct.Id 本次事件的ID
reins.Instruct 本次事件的指令
instruct.Param 本次事件的参数,Dictionary
*/
public string Exec(instruct instruct){
loginfo.Info("__Demo Start !");
string result ="";
try{
/*
在此编写业务逻辑
*/
result = "返回内容";
}catch (Exception e){
result = e.ToString();
}
loginfo.Info("__Demo Finish !");
return result;
}
}

Server 端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class ServerService {
public static log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static string connStr = "Database=xxx;Data Source=0.0.0.0;User Id=yyy;Password=zzz";
/*
reinstruct reins:
reins.Id 本次事件的ID
reins.Instruct 本次事件的指令
reins.Memo 本次事件的反馈信息
*/
public string Exec(reinstruct reins) {
loginfo.Info("__Demo Start !");
string result = "" ;
try
{
MySqlConnection Conn = new MySqlConnection(connStr);
Conn.Open();
MySqlCommand command = Conn.CreateCommand();
/*
在此编写业务逻辑
*/
Conn.Dispose();
result = "success";
}
catch (Exception e) {
result = e.ToString();
}
loginfo.Info("__Demo Finish !");
return result;
}
}

逻辑完成后,模块就开发完成了。

模块安装

编写完成后,需要将打出的DLL文件,复制到Server端Update目录下:

E:\MyServices\WebOpsServer\Module\update

同时复制到被控机器的Client端下

E:\MyServices\WebOpsClient\Module\update

模块调用

目前此系统支持三种调用方式,分别为:

1、 客户端定时调用,在每个客户端下均有crontab文件,将需要执行的模块写入内部,即可开始调用,文件写法规范如下:

数字 模块名 参数

│    │      └─代表的执行频率,秒钟,必须是5的倍数

│    └──────模块的名称

└──────────────────模块需要传入的参数(json)

例如:

#每25秒钟执行ServerRepoCheck 传入的参数为1-> D:/OfficialCluster

25 ServerRepoCheck {“1”:”D:/OfficialCluster”}

模块调用后,会在log_self_exec 写入整体调用过程日志

2、 服务端定时调用,在manager数据库的task_interval表中,填写入数据,即可开始由服务端发起的定时调用

例如下框中,每10秒钟调用10.0.20.11 执行 NodeRepoCheck 参数为 alias->OfficeCluster,f_version->

调用过程会写入log_trigger_async_exec(异步模式) 或 log_trigger_sync_exec(同步模式) 中

3、 服务端队列调用,在manager数据库的task_queue表中,填写入数据,即可开始由服务端发起的定时调用

每个任务只会执行一次,当flag致成q(queue) 后5秒钟内执行,只需要填写下表红框内的字段

队列调用后会自动生成id,调用过程会写入log_trigger_async_exec(异步模式) 或 log_trigger_sync_exec(同步模式) 中