通过Ansible playbook部署应用程序而不会使双方都失败

时间:2015-03-23 21:27:00

标签: java amazon-web-services jenkins ansible

我正在使用Ansible来部署Java Web应用程序。部署是安静的基础,通过Ansible运行Jenkins手册,将jar文件复制到2个独立的应用服务器,称为node-01a和node-01b,都在Amazon AWS负载均衡器后面。

目前,部署同时在node-01a和node-01b上进行。如果没有两个节点同时关闭,那么最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用serial参数完成任务。见documentation。这是每场比赛。

您还可以指定'并行度'在playbook级别使用命令行参数--forks=FORKS

可能与您无关,但为了完整性,我也quote that

  

任务按顺序执行,一次一个,针对所有计算机   在进入下一个任务之前,与主机模式匹配。

答案 1 :(得分:2)

我更喜欢使用Ansible playbook中的标签逐个区域地运行滚动更新。您应该始终将ELB服务器放在多个区域中,因此使用该主体是一个好主意。

对于任何一台服务器,假设您有两个标签 - 应用程序(应用程序:SuperApp作为示例)和AvailabilityZone(AvailabilityZone:us-east-1a,AvailabilityZone:us-east-1d作为示例)。我这样做是为了确保我只在两个Application都设置为SuperApp时运行我的脚本,并且在脚本运行时将AvailabilityZone设置为适当的区域。

这允许我在使用ec2.py库存脚本时使用名为'doCoolStuff.yaml'的包含脚本:

- hosts: tag_Application_SuperApp:&tag_AvailabilityZone_us-east-1a
  gather_facts: False
  roles:
    - doCoolStuffRole
  tasks:
    - include: doCoolStuff.yaml

- hosts: tag_Application_SuperApp:&tag_AvailabilityZone_us-east-1d
  gather_facts: False
  roles:
    - doCoolStuffRole
  tasks:
    - include: doCoolStuff.yaml

当然,你需要在doCoolStuffRole角色和doCoolStuff.yaml包含脚本中做更多的事情,但整个过程包含在上面。