Ansible
工作需要,接盘又做后端开发,本着不做重复劳动的理念,加上前人留下来的脚本不够优秀,需要重搞一套一键部署的脚本。
之前在Windows平台开发的时候,使用cmd、 powershell也写过一套部署脚本,还算凑合着用。
这次是在Linux平台上,在重整之前,我也调研了下业界经验。最后选择了Ansible。Ansible比起bash简单很多,而且不怕重复执行相同命令有副作用,Ansible内置操作都是幂等的。同样的功能,用bash都能写。但是站在巨人肩膀上,效率更高。
选择Ansible的时候也考虑过Puppet、Chef。
比较之下,Puppet等都需要在每台被部署机上安装agent程序。而Ansible,只要被部署机上有Python即可。
考虑到公司服务器都是内置Python的Ubuntu系统,就放心使用Ansible了。
我们也基于Ansible上编写了应用发布的滚动部署脚本、回退脚本。 也编写了一套一键配置服务器的脚本,目前支持Nginx环境、APP服务器环境、Logstash安装等。
主要用途,结合讯联场景,有这么几点:
- 服务器的配置(包括软件安装)可以做到脚本化、版本控制 —— 服务器的配置应该像源代码一样控制起来,而不是一个黑盒、或是随意性太多,比如redis的安装路径都不一样、测试环境与生产环境的nginx配置不一样。服务器部署文档并没有脚本那么精确,只能算是一份人工操作指南,程序员重复劳动太多
- 适合一套架构需要部署几个环境的场景 —— 比如支付宝国际项目需要一套独立后端系统的需求
- 服务器需要水平扩展,无需人工一台台处理 —— 构建一些应用服务器,将应用服务器加入到nginx load balancer里,都是可以脚本化的(包含在滚动部署里了)
- 应用部署、滚动部署 —— 云收银的部署,感觉有点奇怪,发布的时候需要重新编译一遍程序,两台生产服务器就需要编译两次。虽然部署有脚本,但还是有手工处理的场景。部署没问题的前提是程序员没有checkout错git分支。觉得这个没必要。测试通过,生产环境就直接用测试环境的包,除了配置。这个可以结合jenkins做到的,发布测试环境的同时构建一个生产的包。测试人员验收通过测试包,发布时就用对应的生产包
- 快速构建一套测试环境 —— 如何构建一套mongo集群?测试有这样的需求,刚入职的同事都有这样的需求
- 进程监控是否存在 —— 写好进程检查脚本,通过ansible脚本定时执行就能看到结果了
滚动部署,就是个循环
for i in webservers:
for j in nginxservers:
remove i from load balancer
// wait for a while until webserver i finish processing requests
sleep(1 * minute)
deploy(i)
for j in nginxservers:
add i from load balancer
Jenkins
真正考虑要搭个Jenkins,是因为Android打包太慢了、测试催着开发要最新的测试包。
有了Jenkins,测试可以自己查看最新的包了、开发忙自己的。
题外话,因为历史原因,没在刚开始就在MacOS系统上搭建Jenkins。以至于最后存在了两套Jenkins,另外一套专门给iOS打包用的。
接盘后端系统,顺便规范下之前的开发、测试、发布流程。
发现使用Jenkins Pipeline做持续部署很方便。
Jenkins权限控制
严格控制生产部署。 也不需要写Jenkins插件,做在pipeline里,因为其本身就是基于Groovy的DSL,可以在其中写点代码。
Last modified on 2017-04-13