基于脚本的服务器集群管理工具

基于脚本的服务器集群管理工具

背景:

         随着云计算服务的普及,基于云计算的PaaS、IaaS受到越来越多的关注,使用这些服务的用户也越来越多。对于一些大型的应用而言,可能包含多种服务,而这些服务需要部署在多台服务器上。例如:某个应用可能部署了10台数据库服务器,10台Web Http服务器以及5台静态文件存储服务器等。那么作为应用程序管理员来说,一台一台地登录去管理这些机器显得非常繁琐,而且对于同一种服务(比如数据库服务)的机器需要执行的管理任务又都大致相同,那么对每台机器进行重复的工作也会增加集群管理员的负担。

         应对上述需求场景,我开发了这样一个基于脚本的服务器集群管理工具,它主要具有如下功能和优点:

1、  针对不同应用场景,对服务器进行高效的分组管理。

2、  以可执行脚本作为子任务,可以自定义脚本内容,具有高度灵活性。以多个脚本组成的有序组序列作为可执行任务单元。脚本可分组,同组内可排序,有效组织和管理。

3、  针对不同需求,创建“服务器组<->脚本组”的执行任务。随时启动该任务,便可下达对该服务器组的基于脚本序列的任务执行命令。

4、  提供对“服务器组<->脚本组”的执行任务的运行状态查询,便于监控。可以查看远程服务器控制台的输出显示,当前运行状态,执行到哪个脚本,哪个脚本有异常等等信息。

应用场景举例:

         假如我想为我的10台机器同时安装LAMP。那么首先我们建立一个服务器组server_group,并将这10台机器加入到该组中。接下来,我们创建三个脚本,分别为Setup_Apache,Setup_Mysql,Setup_PHP,然后我们再创建一个脚本组,命名为LAMP_Group,并将前面的三个脚本添加到该组来,并在组内排好顺序(针对有执行顺序要求的任务)。最后,我们创建一个可执行任务<server_group , LAMP_Group>并执行,再状态查询页面中监控该任务的在不同服务器上的个脚本执行情况。

         过一段时间,我又想为另一个服务器组安装某些服务,也需要使用到Mysql ,那么就可以将之前创建的Setup_Mysql脚本复用添加,再增加一些其他需要的脚本,生成新的脚本组。

或是,我突然想查看集群上的某个日志文件,那么编写一个将日志文件内容打印到控制台的脚本,对该集群执行该脚本,再通过监控页面得到远程主机的控制台输出结果,方便查看。

技术实现过程中的关键点:

1、如何将脚本文件拷贝到远程主机上;

     基于pexpect,使用scp命令,进行脚本文件的远程拷贝,因为scp是成熟的命令,可以确保文件的完整性与安全性。

2、如何触发远程主机上脚本的执行;

     触发脚本执行功能使用的pexpect提供的pxssh模块,该模块式是对pexpect核心模块的进一步封装,并用于实现基于ssh方式通信的交互模块。由于,脚本的执行效果与耗时都是无法预知的,客户端触发脚本执行命令后不可能一直等待这些脚本进程结束。因此,在下达执行命令后,客户端应该立即结束自身,而执行脚本应该把运行过程中产生的输出内容重定向写入到某个日志文件中,客户端获取该文件得到输出结果。

         由于主要耗时在网络通信,因此对多台主机采用多线程的方式进行处理。

3、如何获取脚本的运行状态与执行结果。

     有一些重要的问题需要考虑:客户端如何获知这些脚本的执行是否已经结束了?它们是正常结束的,还是出错挂掉的?以及当前正在运行的是哪个脚本文件? 因此,我们需要获取这些脚本执行进程的状态。在linux上,一般用ps命令进行进程状态的查看,使用grep可以进行内容的筛选。在这里,我们利用某种标识串对每个脚本进行标识,这样使用“ps -aux | grep 标识串”命令就可以查看该执行脚本的进程状态了。为了判断脚本文件执行是否是正常退出的,我们在按序执行这些脚本后在日志文件结尾插入一个标识串。如果日志文件中,存有该标志串则证明是正常结束的,否则可能仍在执行或是发生了某些错误。程序里,使用了一些小技巧。

截图及说明:

技术实现:

系统环境:linux(ubuntu)

使用到技术及模块:python2.6 ,pexpect ,web.py(轻量级web框架) , sqlalchemy(ORM) , mysql ,  jQuery , Twitter Bootstrap。

一些说明:

0、  项目包括控制台console和web两个应用

Console 通过根据配置文件作为参数执行命令,web则更好的可以进行服务器、脚本、任务的可视化系统管理。

Console执行:./run_task.py tasks.xml

Web启动:./start.sh  通过浏览器访问,默认端口8080(该文件夹下的database.conf为mysql数据库的配置)

         1、被管理的server需为unix(linux)系统,且装有ssh server(即可以ssh远程登录)。

         2、脚本头部请填写类似“#!/usr/bin/python”等说明,以确保其可以正常执行。

3、该项目目前只开发了一个大致的框架,由于课业压力较大,时间仓促,项目里一些细节的东西可能还需进一步完善。

项目源文件:

  ClusterManagement.zip

原文地址:https://www.cnblogs.com/coser/p/2743267.html