使用Ansible在Debian 8上部署Python项目实践的问题解决

前端时间 @lepture 给我推荐了使用项目部署工具,于是我就花了点时间来学习,可是……实际上花的时间比我预期的要多。既然话了不少时间,那么我就再花点时间写点东西总结一下。 简单来说,ansible使用yml文件作为各种系统安装脚本的配置文件,这样你就可以简单且安全的编写你所需要的系统配置。比较强大的是,ansible提供了ansible-galaxy这一平台,用来分享自己或使用别人对于各个系统组件的配置。 关于Ansible的使用,你当然可以看一下官方文档。不过官方文档有点啰嗦,如果想快速入门,可以参考以下资料:
  1. An Ansible Tutorial
  2. Vagrant & Ansible Quickstart Tutorial(在开发时,配合vagrant使用)
另外可以参考一下 @lepture 的配置实践: ansible-galaxy上的配置分享质量参差不齐,ansible-python-china中除了自己编写的部分,主要使用了StoutsANXS这两者的组件配置。 以下是ansible-python-china使用到的组件清单requirements.yml:
- src: Stouts.redis
  path: roles/
- src: Stouts.memcached
  path: roles/
- src: Stouts.nginx
  path: roles/
- src: Stouts.python
  path: roles/
- src: Stouts.supervisor
  path: roles/
- src: ANXS.postgresql
  path: roles/
但是我在使用vagrant启动debian系统安装的时候,却报错了,发现是这些配置中使用了ppa,ansible中配置ppa只支持ubuntu,不支持debian系统。本来想重新去找别人的脚本的时候,却发现stouts在github已经修复了大部分配置中关于debian的兼容问题:可以将各个组件ppa地址设置为false。而作者并没有在ansible-galaxy上把ansible配置更新到最新版本。幸好ansible-galaxy也支持从github地址安装,所以在requirements.yml将src值改成对应的github地址即可。 即便如此,运行到supervisor安装配置的时候却失败了。错误信息为:
TASK: [Stouts.supervisor | Ensure the supervisor is started] ******************
<127.0.0.1> REMOTE_MODULE service name=supervisor state=started
failed: [default] => {"failed": true}
msg: Failed to start supervisor.service: Unit supervisor.service failed to load: No such file or directory.
可惜我对Linux系统并不怎么深入了解,我也并不清楚为啥supervisor的service找不到。这个地方困扰了我很长时间。于是我就扔了个issue上去,希望作者能解决这个问题。不过作者虽然创建了很多个系统组件的ansible配置项目,不过最近却不怎么及时看github,一直都没回应。终于我决定自己看看Stouts.supervisor的编写,看看到底是什么问题。 翻到配置出错的地方,是启动supervisor服务时出错,不过看上面的配置,安装supervisor的时候确实使用pip安装的,然后自己编写了服务启动脚本。为啥这个脚本在debian上不起作用? 我注意到这个启动脚本被放到了/etc/init这个位置,而我熟知的位置不是/etc/init.d么?改成了这个位置再跑脚本也同样出错。我把这两个路径放到google搜了一下,才知道原来是两种不同服务管理系统造成的:在ubuntu上使用的是比较新的upstart,而debian使用的是老的sysvinit。所以只要针对debian系统写一个启动脚本就可以了。所以我fork了Stouts.supervisor项目,针对ubuntu和debian两种系统时,配置文件会给不同服务启动脚本,给原作者做了pull request,大功告成。 不过到现在原作者还没去合并pull request,算了吧,反正可以直接引用github地址,目前就直接用我自己fork的Stouts.supervisor吧。以下是我的playbook.yml,大家可以参考一下:
- src: https://github.com/Stouts/Stouts.python
  path: roles/

- src: https://github.com/Stouts/Stouts.nginx
  path: roles/

- src: https://github.com/Stouts/Stouts.redis
  path: roles/

- src: https://github.com/fengluo/Stouts.supervisor
  path: roles/

- src: https://github.com/ANXS/postgresql
  path: roles/
这次算是我在debian系统上实践遇到的问题并解决掉它的经历分享。下次我给出完整的ansible配置分享吧。 Enjoy it!