文 /陆春 黄杰 陈云
高校信息化快速发展,随着信息化建设的逐步深入,IT运维管理和提高服务能力也越发得到重视。随着IT规模不断扩大,应用系统的迭代速度越来越快,运行环境对可用性和伸缩性的要求不断提高,这给基础设施维护工作带来巨大的压力与挑战。
系统管理员面对几百台服务器和应用服务,传统方式下通过手工操作或是使用定制脚本实现部分工作的自动化或者半自动化。但是,这种方式在服务器数量日益增多,软件应用环境日趋复杂的情况下,渐渐显得捉襟见肘,问题主要体现在以下几个方面:1.手工操作避免不了会有误操作、漏操作等人为因素带来的问题;2.手工操作难以保证多个系统参数配置的一致性,尤其是在多人共同维护的情况下;3.定制的脚本虽然能在一定程度上提高一些重复性操作的效率,但是定制脚本的通用性差,开发调试过程复杂,而且对脚本本身的管理也不是件轻松的事。这样产生的后果就是问题千奇百怪,故障定位困难,不仅用户的满意度大打折扣,而且运维人员疲于应付,工作效率较低下。
鉴于以上现状,迫切的需要一种实现自动化配置的方法。所以,上海财经大学基于开源自动化配置管理工具Puppet搭建了自动化配置管理系统,并借助该系统,实现了大部分主机配置管理的自动化,取得了较好的应用效果。
Puppet是开源的基于Ruby的自动化系统配置管理工具,遵循GPLv2版权协议,其目标是帮助系统管理员快捷高效地完成基础设施整个生命周期的自动化管理。
Puppet主要用来管理Unix和Linux平台,从2.6版本后逐步开始支持Microsoft Windows系统。Puppet通常可以用来管理一台主机的整个生命周期:从初始化到安装、升级、维护以及最后将服务迁移并下线。
Puppet既可以在C/S模式下运行,也可以在一台主机上独立运行。大多数的使用场景中,会选择C/S模式。该模式下,服务器端运行着Puppet Master,被管理的客户端安装Puppet Agent。当Puppet Agent连接上Puppet Master后,该结点的配置信息会被编译,然后在客户端上运行。Puppet Agent可以后台进程的方式运行,默认每半个小时向服务器发起一次请求,当有配置发生改变时,自动进行配置更新。也可以通过crontab的形式,达到类似的效果。如果客户端的配置信息通过其他方式被改变了,还可以从服务器获得原始配置进行修复,确保客户端的配置和服务器端的配置是一致的。
Puppet管理实际上是客户端所应有的状态,客户端根据当前是否达到这个状态决定采取相应的动作。Puppet将所有可操作对象抽象为资源,目前已实现的有40多种,如文件、用户、用户组、主机名、软件包、服务、计划任务、执行命令等。
实施自动化配置管理,首要的工作就是对现有的系统配置进行梳理,将各项配置标准化。所谓标准化,是指对服务器环境中的各种配置制定统一的技术规范、准则或者约定。具体来讲,包括明确定义所使用的软件及版本,基础服务的地址(如dns、ntp、yum),常用软件的默认配置,应用软件的安装目录,主机名的命名规则等。
Puppet支持多种部署方式,从支持上百个结点的系统默认最小化部署,到支持万千上万结点的集群式部署,都能从容应对。我校目前服务器规模在200左右,而且刚开始实施配置管理自动化,对Puppet的使用还处于探索阶段,所以先选择了最小化部署方案。如图1所示,自动化配置管理系统主要包含配置版本库、PuppetServer、PuppetClient几个组成部分。各部分的功能如下:
配置版本库。用于存放各服务器的配置信息,并对配置信息进行版本控制,记录服务器配置修改的过程,在必要时还可以进行回退。配置版本库支持SVN、GIT等常见的版本控制软件。
图1 系统架构
PuppetServer(Master)。PuppetMaster负责接受来自各服务器结点上的请求,验证客户端的身份,并返回相应的配置信息给客户端。服务器端有可能会成为整个配置管理系统的性能瓶颈,将来根据需要可以把默认的WebrickHttpServer更换成Apache或者Nginx,还可以集群方式部署,增加多个PuppetMaster结点。如果是更大规模的部署,还可以增加消息队列服务,以确保数以万计的客户端请求,能够可靠地被接收和处理。
PuppetClient(Agent)。在所有需要集中配置管理的客户端上,都必须安装PuppetClient,以定时向配置服务器请求配置信息,并将这些配置应用到所在的系统中。客户端的安装配置比较简单,但是往往数量众多,为了方便部署,可以编写自动化脚本,一个命令即可自动完成客户端的安装和配置。在虚拟化环境中,可以直接在模板中预先完成这些安装配置工作。
该部署方案,结构简单,配置方便,在现阶段足以满足我们的需要。将来服务器规模扩大后,再对当前架构进行扩展,也不会影响已有结点的配置。
系统安装配置完成后,必须根据需求开发相应的配置管理模块。在Puppet Forge上有大量由开源社区贡献的模块,所以,模块的开发并不需要从零开始。用户可以从中挑选适合自身环境和功能需求的模块来使用,也可以在现有模块的基础上进行二次开发来满足需求。对于一些特殊的需求,根据Puppet相关文档开发一个新的模块,也是比较容易的。
截至本文完成时,上海财经大学信息办按照现有环境中使用的软件和配置需要,已经开发和使用了表1中所列的模块。这些模块基本上覆盖了学校服务器环境所使用的软件,可以自动完成绝大部分的日常配置工作。在将来,这些模块还会不断更新、完善和增加,以实现更加稳定、可靠和自动化程度更高的配置管理。
表1 模块列表
配置管理自动化适用于那些数量大,可描述,并且可重复的情况。数量大是指被管理对象数量大,数量越大,自动化的优势越明显。可描述是指配置项可以用计算机可以理解的形式进行描述,可重复是指同样的操作在同样的环境反复执行得到的结果是固定的,这两个特征是实现自动化的前提条件。因此,在实施过程中,要根据以上原则对纳入自动化管理的配置项进行选择,不能盲目追求自动化的全覆盖。
和所有程序开发一样,Puppet模块的开发也应该遵循一定的规范。Puppet官方文档中有相关的指南,对开发的基本原则、编码风格、设计模式等方面提供指导。这些内容都是在长期实践过程中总结出的最佳实践,对开发出更加容易维护,更加容易扩展的代码有很大的帮助。
配置管理的自动化主要是变更的执行过程的自动化,并不意味着不需要人的干预和管理。自动化配置管理系统的操作应该纳入到配置管理和变更管理的流程控制范围之内,使得配置变更能够在规范的流程管理之下有序地执行。
通过搭建集中配置管理平台实现了对学校IT基础设施中近200台服务器(包括Linux、HP-UX、solaris、Windows等多种操作系统)的自动化配置管理。操作系统初始化的配置实现了标准化控制,配置的变更和修改实现了集中控制和自动化应用,软件的安装和配置实现了版本统一和快速安装,参数的个性化配置满足不同业务的需求,同时实现了对业务系统的自动化发布和部署管理。极大地提高了运维人员的工作效率,降低了出错风险,保障了业务系统的持续健康稳定运行。
以操作系统安装升级为例,新增服务器操作系统安装,软件与补丁安装,安全配置等工作,占到我部服务器维护人员日常工作的20%。这类工作,重复程度很高,而且比较费时。采用集中配置管理之后,制定好经过验证的Puppet模块之后,发送各个客户端,能够在几分钟的之内完成之前需要两三天所要进行的工作,而且能够确保所有软件安装、参数和预定的配置完全一致。
此外,对于其他管理规定中的工作,也可通过Puppet这样的有效工具进行落地。如我部在安全管理办法中定义所有服务器管理员密码必须每三个月更换一次,但考虑到我部管辖到上百台服务器,现有人力手工操作根本无法达成这样的标准,这使得许多规范都成了所谓的“看看”规范,采用了Puppet集中配置管理之后,通过制定好密码规则,五分钟之内即可将所有服务器的管理员密码进行修改,极大地提高了运维人员的工作效率。
集中配置管理平台虽然在保证服务的持续稳定高效运行方面发挥了重要的作用,但在实践中还是有更多工作要做:
1.Puppet服务器目前还是单节点运行,存在单点故障隐患。我们将解决Puppet服务器集群环境的建设,既可以消除单节点的故障隐患,又能增加Puppet服务器集群的处理能力,管理控制更多的客户端,满足日益增长的服务器数量。
2.集中配置管理是自动化运维平台的一部分,下一步将考虑其与自动化运维平台中其他组成部分的接口,如自动化监控、CMDB等,形成一整套自动化运维体系,完成这些工作还需要相当的努力。