使用Ansible进行平滑发布服务整理

针对每次发布服务都是单个实例发布的情况,在目前或者以后进行开发升级,手动发布的流程可以进行优化。
使用ansible的平滑发布,可以一次串行或者并行升级多个实例。

创建发布组

[test]
192.168.248.53
192.168.248.73

定义ansible发布任务配置

---
 - hosts: "{{ machine }}"
  remote_user: developer
  serial: 1
  tasks:
 - name: stop server
    command: supervisorctl -c /opt/developer/super/supervisord.conf stop server
 - name: copy file to remote server
    copy: src=../server/target/server.jar dest=/opt/developer/server/
 - name: start server
    command: supervisorctl -c /opt/developer/super/supervisord.conf start server
 - name: sleep 60s
    command: sleep 60s
  • 其中,指定 serial: 1参数可以让Ansible进行单台实例串行发布,如果不指定的话默认为并行发布。强调一点,一定要指定serial参数,避免进行并行发布(并行发布的时候当前发布组的服务同时下线,调用方调用失败会进行重试,有可能会到达最大重试次数后抛出异常导致调用方业务失败)
  • 最后的任务强制等待60s是为了确保当前发布的服务节点已经添加至eurek中心并且更新至调用方可用服务列表中。参考ribbon源码,默认为30s后会向eureka中心获取最新的服务列表并进行更新。所以,最小的等待时间为30s,推荐配置为sleep 60s

gitlab-ci脚本配置

主要做两件事

  1. 编译代码
  2. 使用ansible进行发布

样例如下

test:
  stage: deploy
  tags:
     - runner-102-51
  script:
     - mvn clean install -DskipTests -Ptest -U
     - ansible-playbook deploy/deploy.yml -i deploy/hosts --extra-vars "machine=test"
  when: manual

最佳实践

  • 测试环境,服务部署2节点,创建Ansible的1个主机组,gitlab-ci建立1个发布任务,进行一次发布,ansible串行发布至2个节点中。这样在多人调试的环境中,当前发布的服务永远都是保持可用的,不会出现单点故障,并且并不会增加人工发布的复杂度。
  • 生产环境,服务部署n(n>1)个节点,创建Ansible的2个主机组,[pro1],[pro-cluster],分别指定1,n-1个机器节点,gitlab-ci建立两个发布任务,当pro1组的机器发布完成后进行观察,确认无问题后,进行pro-cluster组的发布。大大简化发布流程。

你可能感兴趣的:(工具)