我正在使用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
答案 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