配置管理通常是指软件配置管理(SCM)。这个系列文章中讨论的配置管理是指软件系统中配置信息的管理。因为没有见过比较正规的定义,为了和软件配置管理区分开,我将其命名为系统配置管理。配置信息的管理,作为系统管理的一部分,是SaaS系统日常运维工作的重要组成部分。
这个系列文章用来探讨软件开发和运维中系统配置管理的相关问题和技术。作为第一篇,本文简单介绍配置信息的定义,作用和常见的形式。
配置信息的定义和作用
为了明确探讨的目标,本文将配置信息定义为软件系统中运维人员或用户可以直接或间接修改的并能改变系统行为的信息。这个定义强调了配置信息的几个特点:
- 配置信息是运维人员或用户可以修改的。这其实也说明了配置信息是可以在系统交付后(部署和运行时)由非开发人员修改的。
- 配置信息是直接或间接修改的。直接修改是指对系统明确定义的配置项的值的修改,而间接修改则是指对系统所依赖的环境的修改。例如,修改配置文件可以看作是直接修改,而修改主机的IP地址对于运行其上的应用程序则可能是间接修改。
- 配置信息是用来改变系统行为的。这是软件开发中使软件能适应不同的环境和目的,实现可定制化的一种方法。从这种角度看,配置信息也是一种代码,它是可以由用户编写并由读取的软件进行解释执行的。
配置信息的常见形式
根据以上的定义,几乎所有用户能修改并改变软件系统的行为的,都可以看作是配置信息。现将目前能看到的常见的配置的形式列举如下:
命令行参数
如果软件或组件的启动命令行参数是用户可以控制的,那就可以认为这些命令行参数是该系统的配置信息。而如果启动参数只是在其他组件调用时指定的,而不是由用户直接指定的,则可以不看作是配置信息。
环境变量
环境变量是操作系统提供的标准的配置方法,它可以用来配置任何能用有限长度字符串表示的配置值。
配置文件
配置文件是最常见的配置方式之一。常见的配置文件的格式有:
- ini文件
- xml文件
- java propertities文件
- json文件
- yaml文件
这里不深入到各种文件的格式,网上可以搜到。它们的共同点是它们都定义了一种结构化的文件结构,方便人和代码容易地定位到特定的配置值。以相对复杂的xml为例,在以下xml文件中,
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>
使用XPath串 /bookstore/book[1]/title/text()就可以定位第一本书的标题。
除了这些常见的配置文件格式,还有一些其他的配置文件格式。其实任何格式的文件都可以做配置文件,只要它的内容是可以修改且程序可读的。曾经在一个项目见过这样一个bat(批处理)文件(伪代码):
... SET USER=__USERNAME__ startservice %USER% ...
在软件安装时,安装脚本会用安装向导中输入的用户名的值替换__USERNAME__。虽然这种做法是不可取的,但没有什么能阻止程序员这样做。在早期的软件中还经常会出现二进制的配置文件,这些文件通常都配有配置UI来更改值,而不是让用户直接编辑文件。
数据库
数据库作为一种数据存取技术,用来保存配置信息可以方便程序对配置信息的存取。Windows的注册表可以看作是配置数据库的代表。使用数据库存取配置信息通常需要配置UI方便用户更改配置值,而不是让用户直接修改数据库。在分布式系统中,集中的数据库可以实现配置信息的集中管理,能简化管理工作。
配置服务器
配置服务器用于分布式系统中,为系统中的节点提供配置信息的集中存取服务。DHCP服务器可以看作是一种配置服务器。当网络中的机器启动时,会向DHCP服务器请求IP相关的配置。配置服务器与配置数据库的一个重要不同是配置服务器可以主动向各节点推送配置信息的变化。
下一篇将介绍各种不同的配置形式在程序存取,软件部署安装,用户修改和程序及时更新等方面的不同。