以前实现一个web网站时,部署起来特别费劲。因为rd要搭建自己的测试环境,QA还要去在自己机器搭建环境。。那来回搬环境就容易出现各种问题。
主要问题有以下几个:
①网站配置文件中要指定很多特定的配置,而后在代码中要读取这些配置。 那QA拿到你代码后去部署时还要手动修改你的配置文件,如果配置多的话及其繁琐并且容易出错。
举个简单例子:我们要将domian写在配置文件中,而后在代码中可能要生成一个跳转的网址。而QA搭建的环境中设置的跳转地址是不同的。
(那这个需要手动来指定显然不好,能否自动呢?)
解决办法:自动生成配置文件。
我们可以直接实现一个python脚本(比如名字叫gen_config.py),其接收不同的命令行参数,而后解析用户传入的参数。并且用这些传入参数来生成一个配置文件并写入。(一行一个k=v)
这样的话:用户只要运行这个脚本加不同的命令行参数组合就可以自动生成配置文件了。
②上述自动生成了配置文件,但是这个配置文件非常简单!!简单到一行就是一个k-v对。那如果我想写一个复杂的配置文件呢?貌似①这种简单写文件方式无法支持复杂结构的配置文件。
举个例子:我希望php配置文件中依据不同的模块来划分成不同的配置,如下:
$mysqlconfig = array(
'host'=>1,
'port'=> 2,
'passwd'=>3,
'user'=>4,
);
$redisconfig = array(
'host'=>1,
'port'=> 2,
'passwd'=>3,
'user'=>4,
);
$domian = 'www.a.com';
解决办法:我们自动生成的文件是一行行的k-v对。
那如果不存文件的话:我们就完全可以得到一组数据,这个时候我们可以考虑web开发中常用的前端模板技术!
以前是把数据传给Html模板来渲染成最终的页面。 那我们完全可以按照所应用模板的语法写一个非html的模板:配置文件模板(该模板中就定义了上述复杂配置结构),而后将上述数据传进这个模板来进行渲染就生成了最终的复杂数据结构配置文件内容,最后将之写入一个文件就最终生成了:拥有复杂数据结构的配置文件!
比如我们用mako模板方法写一个配置文件模板,内容如下:
$mysqlconfig = array(
'host'=>${sqlhost},
'port'=> ${sqlport},
'passwd'=>${sqlpwd},
'user'=>${sqluser},
);
$redisconfig = array(
'host'=>${redishost},
'port'=> ${redisport},
'passwd'=>${redipwd},
'user'=>${redisuser},
);
$domian = ${domain};
所以模板技术不仅仅是用于前端的,后端自动化也完全可以使用。
所以综合上述①②:我们为了自动生成具有复杂结构的配置文件:
需要实现一个python脚本,让用户命令行参数传入配置信息,而后依据这些配置信息来渲染事先指定的配置模板并将结构写入文件就可以了!
这样用户只要执行一条命令就可以自动生成一个复杂数据结构的配置文件。
③我们一个web服务可能有很多服务组建支持,比如我们用到了memcache,cgi,mysql·····那如果从0开始搭建来启动这个程序,我们就需要执行多条命令来分别启动各个服务组建!而且每一个服务组件的启动还要添加很多命令行参数,比如指定端口,日志文件路径····· 这整个过程太复杂了!
我们希望达到的状态是:用户就一条命令就可以启动所有服务!并且不需要加如何参数!
那为了实现这点:我们需要将多条命令合并起来一起执行;而不加参数这个,我们可以把启动参数都写道前边配置文件中,想办法在执行多条命令时:各条命令自己去自动读取配置就好了!
这里我们可以使用make来实现! make会读取Makefile文件并对应执行。
那我们写一个Makefile文件,而后在里边定义一个自定义命令来对应一组操作,比如:
start_web:
python gunicorn.py -p
python gunicorn_daemon.py
@echo 'server start!'
这样我们只要指定make start_web命令就可以执行2条命令。 我们就可以用这种方式将多条命令组合成一条命令~比如一条启动mysql 一条启动redis。。。
那余下的问题就是该如何让各条命令来自动读取配置信息呢?比如上边 Python gunicorn.py -p 2929 这个2929端口如何自动读取进来呢?
这就牵扯在Makefile中如何定义变量的问题。
我们可以实现一个脚本,其输入不同的参数就会返回不同的配置信息,比如这个脚本名字叫 get_config.py
当执行get_config -port 命令时返回2929
哪下一步我们就可以在Makefile中调用了,样式如下:
start_web:
python gunicorn.py -p `./get_cofig.py -p`
python gunicorn_daemon.py
@echo 'server start!'
这样Makefile就可以自己读取配置信息了。
所以为了实现这一点:我们还要写一个python脚本,用来依据不同命令行参数获取不同配置信息。
这样问题3也解决了。
总结:
为了解决web应用自动部署的问题,我们需要做如下工作:
1.建立个gen_config.py这样的脚本,使用模板技术,依据用户输入的命令行参数来自动生成:复杂结构的配置文件
2.使用Makefile将启动命令精简,为支持这一点:需要实现一个获取配置信息的脚本:依据不同命令行参数来获取配置信息。