◆潘春华
(北京林业大学信息中心 北京 100083)
基于PowerShell脚本和轻量级Web服务的IT系统运维监控Agent设计与实现
◆潘春华
(北京林业大学信息中心 北京 100083)
WindowsPowerShell是一款拥有Shell和脚本能力的可管理工具,可以用来调用WMI、COM组件和.NET库。本文利用PowerShell脚本语言,结合Microsoft .NET Framework中的System.Net.HttpListener类实现了一个基于轻量级Web服务的系统运维监控Agent。该Agent易于使用,具有较好的灵活性和扩展性。
PowerShell;轻量级Web服务器;Agent;运维监控
随着信息化建设的快速发展,各类应用系统以及网络系统的规模不断加大,各种操作系统、数据库、应用软件、中间件的数量和类型也不断增多,IT信息系统越来越复杂,很多企业意识到IT运维监控的重要性。目前常用的 IT运维监控有诸如 Cacti、Nagios、Zabbix等优秀的开源监控软件,以及以HPOpen View、IBM Tivoli等为代表的国外收费运维监控软件,以北塔、广通信达、摩卡、网强、天元等为代表的国内收费运维监控软件。这些IT运维监控软件,多采用SNMP、RMON协议或Agent技术来实现监控端与被监控端之间的消息通讯,而且多采用 Socket方式[1][2]。虽然这些运维监控软件在不同程度上解决了复杂 IT环境的监控,但是这些产品使用很复杂,需要一个专业团队的项目实施才能把产品用起来。就其被监控端的Agent而言,安装和配置较为繁琐,无法扩展自定义监控运维功能。针对上述问题,本文采用PowerShell脚本语言实现了一个系统运维监控Agent。该Agent是一个超轻量级WEB服务器,并能执行PowerShell脚本。它具有使用简单,功能扩展方便,通过REST API方式直接调用等优点。
PowerShell是一款拥有Shell和脚本能力的可管理工具。可以用 来 调 用 Windows 管 理 规 范 ( Windows Management Instrumentation,WMI)、COM组件和.NET库。PowerShell在一代一代的微软产品中变得更加突出。在大量的微软产品中,对于它的支持是捆绑式的,并有所加强。Windows Server及其Hyper-V、Exchange、Active Directory、SharePoint,甚至SQL Server所有这些都添加了 PowerShell支持和 cmdlet。甚至一些供应商如VMWare、Citrix、Cisco和 Quest提供了允许他们的产品被PowerShell访问的方法[3]。通过安装SSH.NET组件,Windows用户可以使用SSH安全地连接到其它Windows和Linux机器,并运行终端命令。PowerShell与 SSH的结合将为远程管理 Linux和Windows系统提供一个健壮安全的解决方案[4]。
2.1 Web服务器工作原理及轻量级Web服务器
Web服务器是一种可以向客户端提供服务的程序,它运行在服务器端,当监听到客户端的服务请求时,服务器程序会响应请求并向客户端反馈信息。其基本业务流程如下:WEB服务器创建一个监听socket然后开始循环接受新连接。客户端初始化一个TCP连接,在连接成功后,客户端发送HTTP请求到服务器,服务器端对请求进行处理,并响应一个显示给用户的HTTP响应。客户端和服务器都使用socket建立TCP连接。
图1 Web服务器基本业务流程图
目前广泛被使用的 web服务器有以 Apache、IIS、Bea WebLogic、Jboss等性能优良、安全性高、能实现虚拟主机、能与应用程序集成等为代表的大型Web服务器,也有以Lighttpd、Nginx、Nodejs等为代表的小型Web服务器。这种小型Web服务器通常被称为轻量级Web服务器。
轻量级Web服务器与一些大型的Web服务器相比具有很多优势。其占用资源低、营运成本低、复杂度低、运行速度快、部署方便,并在一些特定的环境得到广泛的应用[5]。如在网络路由器中嵌入一个轻量级的 Web服务器并定制相关配置功能,就可以实现基于Web页面方式的路由器配置。
2.2 .NET对Web服务的支持
Microsoft .NET Framework中的System.Net.HttpListener类可以实现轻量级的 Web服务。System.Net.HttpListener提供一个简单的、可通过编程方式控制的 HTTP 协议侦听器。使用它可以很容易提供HTTP服务,而无需启动IIS这类大型服务程序[6]。使用HttpListener的方法流程很简单,主要分为以下几步:(1)创建一个HTTP侦听器对象并初始化;(2)添加需要监听的URI 前缀;(3)开始侦听来自客户端的请求;(4)处理客户端的 HTTP请求;(5)关闭HTTP侦听器。
建立HttpListener后,执行Start就开始处理客户端输入请求。HttpListener中GetContext在没有请求准备好处理的时候处于被阻塞状态。GetContext返回一个对象 HttpListenerContext。HttpListenerContext对象的属性Request属性提供了许多关于客户机的一些请求信息。Response则返回一个 HttpListenerResponse对象,该对象可以用来响应客户机的请求。
2.3 Agent设计
本文结合上述Web服务器的工作流程,用PowerShell调用System.Net.HttpListener类,实现一个轻量级Web服务模式的系统运维监控Agent。该Agent采用.NET的资源池来实现多线程模式的用户请求处理。每次用户的请求都对应一项系统运维监控功能。系统运维监控功能采用PowerShell的自定义函数编写,自定义函数为REST风格的API。所有的自定义函数在接收用户请求之前加载到资源池中。基本思路如下:
初始化相关参数(如URL、用户身份认证方案等),并启动HttpListener;
初始化会话状态,创建资源池及其 runspace个数。每个runspace为一个线程,用来处理多个并发的客户端请求。
创建一个PowerShell实例,绑定资源池;
PowerShell实例调用相关方法把用户请求处理过程添加到资源池的runspace中,接收并处理用户请求。多个runspace之间采用异步模式。
Runspace中用户处理请求的过程如下:
(1)用户身份认证。(2)如果身份认证通过,则从用户请求的查询参数中获取 PowerShell命令或自定义函数名称。(3)PowerShell执行用户请求的命令或函数。(4)根据用户需要返回的格式,把命令执行结果(response stream)返回给用户。
图2 Agent结构图
2.4 系统运维监控脚本设计
PowerShell内置了若干命令。这些命令与操作系统,特别是与文件系统交互,能够启动应用程序,甚至操纵应用程序。另外,PowerShell能够充分利用.Net类型和COM对象,来简单地与各种系统交互,完成各种复杂的、自动化的操作。因此PowerShell具有强大的系统管理功能,它不仅能管理服务器操作系统、数据库系统、中间件、应用系统等,而且借助SNMP命令还可以获取软硬件系统的运行状态。
PowerShell可以用单个的命令来完成简单的系统管理任务,也可以把多个命令放到脚本块(Script Block)中或者自定义函数中,按照一定的逻辑执行这些命令来完成复杂的系统管理任务。在用PowerShell进行一项系统管理时,通常需要输入命令所需要的参数,因此本文的系统运维监控脚本统一采用能携带参数的自定义函数的形式来实现。函数的返回值即为命令执行结果。
2.5 Agent实现
本文设计的轻量级Web服务模式的系统运维监控Agent采用PowerShell的模块编程[7]实现。PowerShell模块是一个包(Package),它可以包含Windows PowerShell命令,别名,函数,变量等等。该模块主要处理过程如下:
第一步:初始化参数,如runspace个数,监听端口等等;
第 二 步 : 调 用 System.Net.AuthenticationSchemes、System.Net.HttpListener等方法实现用户身份认证方案、启动Http监听、初始化会话状态、初始化资源池等工作;
第三步:定义用户请求句柄(Request Handler)脚本块,实现请求处理。该脚本块逻辑如下:若干系统运维监控自定义函数,对用户请求的URL参数($request.QueryString.Item)处理,获取用户需要执行的命令名称及其参数,调用$ExecutionContext.InvokeCommand.NewScriptBlock(...)方法装载用户需要执行的命令对应的自定义函数,执行自定义函数,将自定义函数执行结果作为响应对象,并对其处理后返回给用户;
第四步:构造会话请求监听器,等待用户请求。监听器调用HttpListener中GetContext方法阻塞线程,直到请求到达。同时监听器装载第三步定义的请求句柄脚本块;
第五步:创建PowerShell实例,并根据资源池的运行机制和异步执行机制动态创建runspace。在runspace中实现请求处理。实现方法如下:(1)封装相关自定义参数;(2)把(1)中的参数及第四步定义好的监听器载入 runspace中;(3)调用BeginInvoke方法启动异步调用;(4)处理完毕后回收runspace。
服务器端测试。本次测试在运行Windows Server 2008 R2操作系统的服务器上测试。在测试时,先打开系统中自带的PowerShell工具,然后导入模块(httpd.psm1),再启动web服务。步骤如下(并假设httpd.psm1文件位于D:PSS目录):
Import-Module .httpd.psm1
httpd Verbose
在PowerShell中显示为:
图3 web服务启动方法及输出信息
从图3可以看出,Web服务已经启动,正等待客户请求。
客户端测试。本次测试在运行Windows 7 PC机上测试。在客户端的网页浏览器中打开http://202.204.112.82:9998/?cmd=server RunTimeTotal¶m=,则在浏览器中显示:
图4 浏览器访问web服务的输出结果
从图4可以看出,运行本文设计的Agent服务器自上次启动到执行上述请求,共运行了9天6小时44分52秒。
在服务器端PowerShell中显示为:
图5 web服务处理用户请求的输出信息
从图5可以看出,在Web服务器端显示客户端请求的命令,客户端 IP及端口号,以及命令执行结果,即服务器共计运行时间为9天6小时44分52秒。
本测试案例采用匿名方式进行用户身份认证,因此在客户端浏览器中不需要输入运行Agent服务器的账号和密码就能直接显示执行结果。本次执行的命令是一个名为ServerRunTimeTotal的自定义函数,其作用是计算出服务器运行的总时间。结构如下:
Function SysRunTimeTotal{
Param()
$Server=Get_IPAddr
$Uptime = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Server
$LastBootUpTime = $Uptime.ConvertToDateTime($Uptime.LastBootUpTime)
$Time = (Get-Date) - $LastBootUpTime
$timeInfo= '{0:00} 天, {1:00} 小时, {2:00} 分钟, {3:00} 秒' -f $Time.Days, $Time.Hours, $Time.Minutes, $Time.Seconds
return "服务器运行时间:$timeInfo"
}
本文结合 PowerShell强大的系统管理功能,以及.Net Framework对HTTP服务的支持,设计并实现了一个基于轻量级Web服务的系统运维监控Agent。该Agent完全基于PowerShell实现。运行时,只需要导入该PowerShell模块文件,并启动Web服务就行,而不需要安装其它相关组件。通过REST API 接口方式能方便集成到IT运维监控系统中。由于该Agent基于脚本实现,因此在增加相关系统监控运维功能时,只需要在该脚本文件中增加满足于这些功能的自定义函数即可。通过安装SSH.NET能通过该Agent管理Llinux服务器。通过安装SNMP程序,能在PowerShell中执行snmpget、snmpwalk等命令,从而能用该Agent以SNMP方式获取其他软硬件设备及系统的相关信息。因此Agent具有较好的灵活性和可扩展性。在实际系统监控运维中,由于监控端请求不会太频繁,因此轻量级Web服务能满足监控运维要求。
[1]周三琦.基于Agent网络监控系统的研究[J].信息安全与技术,2014.
[2]卢彦兆.信息中心IT运维监控系统的设计与实现[D].北京:北京航空航天大学,2015.
[3]Donabel Santos,著.许昌永,译。PowerShell V3--SQL Server 2012数据库自动化运维权威指南[M].人民邮电出版社,2016.
[4]谢丽.微软宣布 PowerShell将支持 SSH [EB/OL],2015.http://www.infoq.com/cn/news/2015/06/micro-power-s hell-ssh.
[5]马毅.轻量级 Web 服务器的实现与应用[D].西安:西北大学,2008.
[6]https://msdn.microsoft.com/zh-cn/magazine/system.net. httplistener.aspx.
[7]Ed Wilson. Windows PowerShell Best Practices[M]. Microsoft Press,2013.