首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Ansible的高可用性部署

使用Ansible的高可用性部署
EN

Stack Overflow用户
提问于 2014-07-29 12:18:24
回答 3查看 2.2K关注 0票数 0

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

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

我发布了一本叫做deploy.xml的剧本,它看起来像这样:

代码语言:javascript
复制
- 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 servers(而不是app- server /ngx-server),然后是第二个位置,但如果需要添加其他服务器位置,则需要复制剧本内容(以此类推)。

有什么好办法吗?

这是我的主机文件:

代码语言:javascript
复制
#
# 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-09 14:49:25

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

这就是我们要做的,一些改变:

添加地理定位组:

代码语言:javascript
复制
[Montigny-servers:children]
montigny-app-servers
montigny-ngx-servers

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

然后,您可以在子集上使用选项l/-limnit执行您的剧本。

代码语言:javascript
复制
$ ansible-playbooks -i inventory site.yml -l Montigny-servers && \
  ansible-playbooks -i inventory site.yml -l bievre-servers

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

查找更多示例:practices.html#what-this-organization-enables-examples

票数 0
EN

Stack Overflow用户

发布于 2014-09-10 15:49:19

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

但是,您应该能够将其放在一个剧本中--如果您在一个包含脚本中创建了基本操作,那么您就可以创建一个包含多个‘的剧本--主机部分,每个部分都将调用包含脚本。

看起来应该是:

代码语言:javascript
复制
---
- hosts: firstgroupname
  tasks:
    - include: pathandnameofincludescript.yaml
- hosts: secondgroupname
  tasks:
    - include: pathandnameofincludescript.yaml

您的包含脚本看起来类似于:

代码语言:javascript
复制
---
- name: action 1
  command: echo hello world
- name: action 2
  command: echo hello again

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

票数 2
EN

Stack Overflow用户

发布于 2014-07-29 14:28:59

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

您可以使用串行关键字来表示在一次播放中一次应该管理多少主机。所以在下面的例子中,ansible一次只能在两个主机上运行游戏。

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

资料来源: delegation.html#rolling-update-batch-size

代码语言:javascript
复制
- hosts: app-servers`
  serial: 2 
  max_fail_percentage: 1
  roles: 
   - role: deploy-env

然后在部署-env角色中有:

代码语言:javascript
复制
- 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25015122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档