我正在使用Ansible来部署一对NGinx/Tomcat实例,并且在部署期间试图提高可用性。
逻辑实例是1 NGinx +1 Tomcat:我有4个逻辑实例分布在两个遥远的位置(请参阅主机文件下面)。
我发布了一本叫做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 servers(而不是app- server /ngx-server),然后是第二个位置,但如果需要添加其他服务器位置,则需要复制剧本内容(以此类推)。
有什么好办法吗?
这是我的主机文件:
#
# 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发布于 2014-09-09 14:49:25
一种解决方案可能是首先针对montigny-app-server/montigny-ngx-server(而不是app-server/ngx-server),然后是第二个位置。
这就是我们要做的,一些改变:
添加地理定位组:
[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实例的剧本。
查找更多示例:practices.html#what-this-organization-enables-examples
发布于 2014-09-10 15:49:19
我同意将您的主机放在不同的组中,这样您就可以先在一个组上运行命令,然后在另一个组上运行命令。
但是,您应该能够将其放在一个剧本中--如果您在一个包含脚本中创建了基本操作,那么您就可以创建一个包含多个‘的剧本--主机部分,每个部分都将调用包含脚本。
看起来应该是:
---
- 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有时会很烦人..。
发布于 2014-07-29 14:28:59
好吧,这是我认为你真正想要的。
您可以使用串行关键字来表示在一次播放中一次应该管理多少主机。所以在下面的例子中,ansible一次只能在两个主机上运行游戏。
默认情况下,即使前两台机器发生故障,anisble也会继续运行播放,因此您可以使用max_fail_percentage关键字来定义在停止之前可以接受的故障百分比。在下面的示例中,如果1%的机器发生故障,Ansible将停止。
资料来源: delegation.html#rolling-update-batch-size
- hosts: app-servers`
serial: 2
max_fail_percentage: 1
roles:
- role: deploy-env然后在部署-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_boxhttps://stackoverflow.com/questions/25015122
复制相似问题