繁体   English   中英

使用Ansible进行高可用性部署

[英]High availability deployment with Ansible

我正在使用Ansible来部署NGinx / Tomcat实例对,并且试图在部署期间提高可用性。

一个逻辑实例是1个NGinx + 1个Tomcat:我有4个逻辑实例分布在2个遥远的位置(请参阅下面的hosts文件)。

我启动了一个名为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

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

有什么想法使其正确吗?

这是我的主机文件:

#
# 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

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

不过,您应该能够将其放在一个剧本中-如果您在包含脚本中创建基本操作,则可以创建一个包含多个“-主机”部分的剧本,每个部分都将调用包含脚本。

看起来像:

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

并且您的包含脚本应类似于:

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

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

好的,这就是我想您真正想要的。

您可以使用serial关键字说出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

一种解决方案可能是首先定位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选项在子集中执行剧本

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM