使用Ansible进行高可用性部署

时间:2014-07-29 12:18:24

标签: ansible

我正在使用Ansible部署NGinx / Tomcat实例对,我正在尝试提高部署期间的可用性。

逻辑实例是1 NGinx + 1 Tomcat:我有4个逻辑实例分布在2个远程位置(参见下面的主机文件)。

我启动了一个名为deploy.xml的剧本,如下所示:

- hosts: ngx-servers
  pre_tasks:
    - include: tasks/remove-server.yml
  roles:
    - role: ngx-server

- hosts: app-servers
  roles:
    - role: app-server

- hosts: ngx-servers
  tasks:
    - include: tasks/add-server.yml

我想要的是在部署其他逻辑实例之前部署50%的4个逻辑实例(如果出现问题则停止所有操作)。 一个解决方案可能首先针对montigny-app-servers / montigny-ngx-servers(而不是app-servers / ngx-servers),然后是第二个位置,但我需要复制playbook内容(如果我需要添加,依此类推)其他服务器位置。)

有什么想法让它成功吗?

这是我的主机文件:

#
# Serveurs d'application
#

# Montigny
[montigny-app-servers]
mo-app-server-1 ansible_ssh_host=1y.domain.fr ansible_ssh_user=devops
mo-app-server-2 ansible_ssh_host=2y.domain.fr ansible_ssh_user=devops

# Bievre
[bievre-app-servers]
bi-app-server-1 ansible_ssh_host=1b.domain.fr ansible_ssh_user=devops
bi-app-server-2 ansible_ssh_host=2b.domain.fr ansible_ssh_user=devops

# Tous
[app-servers:children]
montigny-app-servers
bievre-app-servers

#
# Serveurs NGinx
#

# Montigny
[montigny-ngx-servers]
mo-ngx-server-1 ansible_ssh_host=1y.domain.fr ansible_ssh_user=devops
mo-ngx-server-2 ansible_ssh_host=2y.domain.fr ansible_ssh_user=devops

# Bievre
[bievre-ngx-servers]
bi-ngx-server-1 ansible_ssh_host=1b.domain.fr ansible_ssh_user=devops
bi-ngx-server-2 ansible_ssh_host=2b.domain.fr ansible_ssh_user=devops

# Tous
[ngx-servers:children]
montigny-ngx-servers
bievre-ngx-servers

3 个答案:

答案 0 :(得分:2)

我同意将主机放在不同的组中的想法,这样您就可以在第一组上运行命令,然后在另一组上运行命令。

你应该可以把它放在一个剧本中 - 如果你在一个包含脚本中创建基本动作,你就可以创建一个有多个' - hosts'部分的剧本,每个部分都会调用include脚本

这看起来像是:

---
- hosts: firstgroupname
  tasks:
    - include: pathandnameofincludescript.yaml
- hosts: secondgroupname
  tasks:
    - include: pathandnameofincludescript.yaml

并且您的include脚本看起来像:

---
- name: action 1
  command: echo hello world
- name: action 2
  command: echo hello again

请注意包含脚本的缩进差异 - 这非常重要! YAML有时会很烦人....

答案 1 :(得分:0)

好的,这就是我认为你真正想要的。

您可以使用序列关键字来说明ansible在游戏中一次应管理的主机数量。因此,在下面的示例中,ansible一次只能在两台主机上运行播放。

默认情况下,即使前两台计算机出现故障,anisble也会继续运行播放,因此您可以使用 max_fail_percentage 关键字来定义停止前可接受的故障百分比。在下面的示例中,如果1%的计算机出现故障,Ansible将停止。

来源: http://docs.ansible.com/playbooks_delegation.html#rolling-update-batch-size

- hosts: app-servers`
  serial: 2 
  max_fail_percentage: 1
  roles: 
   - role: deploy-env

然后在您的deploy-env角色中有:

- name: remove from LB
  include: remove-server.yml
  delegate_to: paired_nginx_box

  /* app-server tasks */

- name: add to LB
  include: add-server.yml
  delegate_to: paired_nginx_box

答案 2 :(得分:0)

  

一个解决方案可能首先针对montigny-app-servers / montigny-ngx-servers(而不是app-servers / ngx-servers),然后是第二个位置

这就是我们所做的,情侣的变化:

添加地理定位组:

[Montigny-servers:children]
montigny-app-servers
montigny-ngx-servers

[bievre-servers:children]
bievre-app-servers
bievre-ngx-servers

然后你可以使用选项-l / - limnit

在子集上执行playbook
$ ansible-playbooks -i inventory site.yml -l Montigny-servers && \
  ansible-playbooks -i inventory site.yml -l bievre-servers

这样它首先会从Montigny运行逻辑实例,如果一切正常(退出0),它将运行bievre实例的剧本

查找更多示例: http://docs.ansible.com/playbooks_best_practices.html#what-this-organization-enables-examples