今天下午要发布一个版本运维平台的版本,对于线上版本的使用思路是这样的。

    1. 线上版本的数据库变更都是通过SQL语句,即线上环境的数据是最准确,最完整的,同时线上环境不做开发环境的配置。对于数据变更这块,这也是我喜欢Django的唯一理由了。我可以很轻松的通过migrations里面的配置使用sqlmigrate生成对应的SQL语句来,如果有10个变更,那么我可以导出对应的SQL语句,依次部署变更即可。

    2. 测试环境的代码是最新的,代码层面我们内部使用了GitLab来做版本控制,在这个基础上开了分支来适配不同的需求。线上环境不做开发环境的调试和配置,只做发布。

    3. 对于测试环境和线上环境使用两套配置文件,两个文件的配置需要做到基本的同步。线上发布的时候只需要调整配置文件即可。不需要再修改里面的配置了。

      所以一般发布的时候,如果没有数据库变更,那么我只需要把代码同步过去即可,如果有数据变更,则需要并行做这两件事情。

      今天发布的时候,整个过程看起来还顺利,但是启动的时候却抛出了错误,提示是ansible的模块支持有问题。

直觉的思路就是使用pip来检查,但是发现pip不可用了。最开始以为是pip导致的。修复方法如下:

  1. from pip import main

  2. if __name__ == '__main__':

  3. sys.exit(main())

修改该文件内容为:

  1. from pip import __main__

  2. if __name__ == '__main__':

  3.  

这个算是第一个兼容问题吧。

紧接着调试,发现没有效果,这是一个要发布的环境出现这样的问题,看起来问题还是比较严重了。问题的难点就在于,目前还无法定位问题的原因。

所以找同事做了确认,近期没有做过包的变更,我唯一记得的就是前段时间做了pip的升级。

所以简单确认后,对pip进行降级。

python -m pip install pip==9.0.1

但是问题还是没有解决,又找另外的同事继续分析,最后发现原来是一个ansible的版本冲突导致,这台服务器还有另外一个业务的同学在使用,他使用的是2.4版本,而我们这个是2.2版本。