你好,我是石雪峰。从今天开始,专栏正式进入了工程实践的部分。在DevOps的体系中,工程实践所占的比重非常大,而且和我们的日常工作息息相关。正因为如此,DevOps包含了大量的工程实践,很多我们都耳熟能详,比如持续集成、自动化测试、自动化部署等等,这些基本上是实践DevOps的必选项。
可是,还有一些实践常常被人们所忽视,但这并不代表它们已经被淘汰或者是不那么重要了。恰恰相反,它们同样是DevOps能够发挥价值的根基,配置管理(Configuration Management)就是其中之一。它的理念在软件开发过程中无处不在,可以说是整个DevOps工程实践的基础。所以今天我们就来聊一聊配置管理。
说了这么多,那软件配置管理到底是个啥呢?
熟悉运维的同学可能会说,不就是类似Ansible、Saltstack的环境配置管理工具吗?还有人会说,CMDB配置管理数据库也是配置管理吧?这些说法都没错。配置管理这个概念在软件开发领域应用得非常普遍,几乎可以说无处不在,但是刚刚提到的这些概念,都是细分领域内的局部定义。
我今天要讲到的配置管理,是一个宏观的概念,是站在软件交付全生命周期的视角,对整个开发过程进行规范管理,控制变更过程,让协作更加顺畅,确保整个交付过程的完整、一致和可追溯。
看到这里,我估计你可能已经晕掉了。的确,配置管理的理论体系非常庞大。但是没关系,你只需要把四个核心理念记在心中就足够了。这四个理念分别是:**版本变更标准化,将一切纳入版本控制,全流程可追溯和单一可信数据源**。
## 1. 版本变更标准化
**版本控制是配置管理中的一个非常核心的概念,而对于软件来说,最核心的资产就是源代码**。现在很多公司都在使用类似Git、SVN之类的工具管理源代码,这些工具其实都是版本控制系统。版本描述了软件交付产物的状态,可以说,从第一行软件代码写下开始,版本就已经存在了。
现代软件开发越来越复杂,往往需要多人协作,所以,如何管理每个开发者的版本,并把它们有效地集成到一起,就成了一个难题。实际上,版本控制系统就是为了解决这个问题的。试想一下,如果没有这么一套系统的话,所有代码都在本地,不要说其他人了,就连自己都会搞不清楚哪个是最新代码。那么,当所有人的代码集成到一起的时候,那该是多么混乱啊!
不仅如此,如果线上发生了严重问题,也找不到对应的历史版本,只能直接把最新的代码发布上去,简直就是灾难。
**配置管理中的另一个核心概念是变更**。我们对软件做的任何改变都可以称之为一次变更,比如一个需求,一行代码,甚至是一个环境配置。**版本来源于变更**。对于变更而言,核心就是要记录:**谁,在什么时间,做了什么改动,具体改了哪些内容,又是谁批准的**。
这样看来,好像也没什么复杂的,因为现代版本控制系统基本都具备记录变更的功能。那么,是不是只要使用了版本控制系统,就做到变更管理了呢?
的确,版本控制系统的出现,大大简化了管理变更的成本,至少是不用人工记录了。但是,从另一方面来看,用好版本控制系统也需要有一套规则和行为规范。
比如,版本控制系统需要打通公司的统一认证系统,也就是任何人想要访问版本控制系统,都需要经过公司统一登录的认证。同时,在使用Git的时候,你需要正确配置本地信息,尤其是用户名和邮箱信息,这样才能在提交时生成完整的用户信息。另外,系统本身也需要增加相关的校验机制,避免由于员工配置错误导致无效信息被提交入库。
改动说明一般就是版本控制系统的提交记录,一个完整的提交记录应该至少包括以下几个方面的内容:
- **提交概要信息**:简明扼要地用一句话说明这个改动实现了哪些功能,修复了哪些问题;
- **提交详细信息**:详细说明改动的细节和改动方式,是否有潜在的风险和遗留问题等;
- **提交关联需求**:是哪次变更导致的这次提交修改,还需要添加上游系统编号以关联提交和原始变更。
这些改动应该遵循一种标准化的格式,并且有相关的格式说明和书写方式,比如有哪些关键字,每一行的长度,变更编号的区隔是使用逗号、空格还是分号等等。如果按照这个标准来书写每次的变更记录,其实成本还是很高的,更不要说使用英文来书写的话,英文的表达方式和内容展现形式又是一个难题。
我跟你分享一个极品的提交注释,你可以参考一下。
>
switch to Flask-XML-RPC dependency
CR: PBX-2222
The Flask-XML-RPC-Re fork has Python 3 support, but it has a couple
other problems.
test suite does not pass
latest code is not tagged
uncompiled source code is not distributed via PyPI
The Flask-XML-RPC module is essentially dead upstream, but it is
packaged in EPEL 7 and Fedora. This module will get us far enough to
the
point that we can complete phase one for this project.
When we care about Python 3, we can drop XML-RPC entirely and get the
service consumers to switch to a REST API instead.
(Note, with this change, the Travis CI tests will fail for Python 3.
The