@yanglfyangl
2018-09-11T05:34:05.000000Z
字数 1346
阅读 419
360
各位,上次我们讨论完后,这是我get到的需求
- 能进行灰度发布
- 操作相对简单
- 对现有系统最好无侵入。
- 能够执行测试脚本
- 根据测试结果决定是否进行回滚
目前在业界,我所了解的情况是,服务器数据小于400台,对于服务部署没有高时间要求的,Ansible是一个很常见的解决方案,而且也很好。
特别是Ansible没有在目标机上安装Agent的要求,侵入性低。
这个工具功能相对简单,主要模块有三个
- 用户管理
- 主机管理
- 任务执行
在主机管理中,可以对主机进行“分组”,在任务执行时,可以选择分组下的主机来执行命令。
而且系统的安全性做的还不错,两层密码保护:登录秘码和vault密码(vault秘码用于加密ssh, sudo密码等)。
同时,从系统架构上来说,相对简单,不管是从代码上还是架构上。但相对也合理,可以支持通过队列的横向扩展。这样未来如果有量和时间的需求的时候,也可以横向扩展。
当然,这个系统也并歪完善,特别是界面看上去有点“low”
这个小工具的“报告”系统对我们应该是方便很多的,可以
- 通过web查看每一步的状态。
- 可以查看在相关机器上的运行情况。
- 可以查看历史记录。
- 。。。
之前的方案是用脚本来部署服务的,整个过程应该分这样几步
- 停掉之前的服务。
- 将之前的ko和相关文件备份。
- 将新的ko文件copy到对应的位置。
- 启动相关的服务。
除了人工成本之外,我个人觉得这里面还有几个问题
- 脚本中某一项任务失败时,没有做处理,可能导致处于“不稳定”状态
- 测试没有放到自动化里。
- 回滚需要手工回滚。
我个人建议的操作流程是:
建议的playbook执行流程是:
- 下载新的服务包。
- 停止相关服务。
- 原服务文件备份。
- 部署新的服务包。
- 启动服务。(失败则进入重试,重试3次,如果还失败,则进入"失败处理"流程)
- 进行测试。(测试失败则进入“回滚”流程,成功则上线)
这里面有两个不同的出问题后的处理流程
- 失败处理:主要是指处理的过程中发现异常,这些异常需要人工参与的。(注:进入失败处理前,需要进行3次的重试 )
- 回滚:指正常的部署完成,但测试未通过,需要回滚到上一版本。
tasks:
- name: 下载新安装包
copy: src=源文件 dest=目标文件
tasks:
- name: 备份老文件
copy: src=源文件 dest=目标文件
tasks:
- name: 部署新包
copy: src=源文件 dest=目标文件
tasks:
- name: 启动新服务
shell: startSuccess = ...
tasks:
- name: 启动重试
shell: startSuccess = ...
when !startSuccess
tasks:
- name: 进行测试
shell: testSuccess = ...
tasks:
- name: 失败回滚
shell: 。。。
when !testSuccess