基于spread的运维工具

最近在给公司开发一些运维工具。
之前也搞过几日运维工作,发现机器一多了批量执行点命令是挺麻烦的,有时候需要更新一些软件配置,执行几个基本命令,或者设置定时备份,清理log等事,也问过一些一直在搞运维的同事,基本实现思路就2个:
1.基于ssh,自己写脚本顺序执行
2.基于cfengine来做。
哎,神啊,cfengine貌似挺不错,但是搞起来也挺麻烦的,还要学它的一堆配置,看着就晕,貌似也没几家真正用的特多的,SSH的方式挺普遍的就是觉得太原始。

自己基于spread消息server,用php写了一个命令分发的工具,只能说是工具,不敢说什么系统或者框架,我觉得那些境界都太高了,我受不起。
只所以自己写主要目的是:
1.能够让多台服务器并行执行命令,SSH这点解决不了,除非多执行几个SSH命令的进程
2.能够不用反复去实现命令发送的过程,有了架子,只需要不断补充实际业务的命令就可以
结构如下图:

基于spread的运维工具
 
1.将不同的产品线或业务分组,一台spread消息server可以支持同时多个组广播消息,客户端只需要通过api声明要加入的业务组就可以,比如http组,db组
2.命令的发起者自己加入一个独立的组sys组用来接收客户端返回命令的执行结果,发起者都要在同一台发布机上
3.命令的发起者在发布一个命令时,将命令或者业务组的唯一标示放入共享内存,用来表示该命令正在被执行,所有的命令发起者在发起命令时,首先要检查共享内存中是否存在,存在表示命令或业务组则表示被锁,正在执行操作,必须要等待共享内存释放才可以申请资源,这样保证命令发起者是排队的。
4.发起者在发送一个命令时,会根据客户端列表(通过从架设时部署的客户端与组对应的配置文件获得),将要执行的客户端名字放入一个池子中,并等待每个客户端通过sys组返回执行结果的消息,收到返回消息后将该客户端从池子中踢走,直到所有客户端返回结果,池子空了,或者超时,才进行下一步操作
5.spread的客户端是根据加入的组来收消息,所以在HTTP组里的所有server都可以收到针对http组的消息,在每个server上都部署一个进程,不断检查消息server是否有命令,有命令则依据自己定义的命令格式才执行操作
我设计的命令格式可以支持执行Linux系统命令,比如ls,cp等,也可以回调客户端进程中的其他函数,比如将一些复杂的业务操作放入函数中,通过回调执行。
6.命令执行成功后,客户端将约定的返回信息通过sys组返回给命令发起者,使命令发起者可以知道任务结束

大体是这样,最近正在基于这个结构写备份命令,备份的命令分为客户端推送数据到备份服务器,备份服务器打包数据,两个大过程,推送数据和打包任务是写在客户端的接受进程中,通过触发回调函数来操作,命令发布机设置定时脚本,定时启动备份命令的发起者发布备份命令。有了这个结构,命令发布者可以统一控制不同业务的协调,只有所有服务器都将数据推送完,才会要求备份服务器打包,避免让打包服务器设置一个很久的定时脚本来盲目打包,各个服务器推送数据也由于有了统一控制,推送的时间可以是顺序执行的,不会使备份服务器接收数据密集,还要分别错开定时脚本时间。

以上属于自己YY,没办法一个人搞,难免孤陋寡闻,如果那位有更好的工具,希望留言指教,三人行必有我师,相关代码就不放出了,实在由于边整理边开发,代码很不够雅致。

你可能感兴趣的:(数据结构,linux,PHP,ssh,脚本)