Ansible滚动重启多集群环境

Ansible滚动重启多集群环境,ansible,ansible-2.x,ansible-inventory,ansible-facts,ansible-template,Ansible,Ansible 2.x,Ansible Inventory,Ansible Facts,Ansible Template,我有一个用例,希望在多个集群中执行滚动重启。作为第一步,我创建了一个任务,在传递给该任务的主机上串行执行,该任务将一次执行一个节点的重启。目前,假设所有集群中的节点总数为n,节点重启需要O(n)个时间,并且节点重启需要固定时间。我希望优化此ansible作业的执行,使重新启动节点的任务在集群中串行执行,但在集群中并行执行,从而产生与集群中最大主机数成比例的有效重新启动时间。给定库存的示例- [Cluster_1] host_1_a host_1_b [Cluster_2] host_2_a h

我有一个用例,希望在多个集群中执行滚动重启。作为第一步,我创建了一个任务,在传递给该任务的主机上串行执行,该任务将一次执行一个节点的重启。目前,假设所有集群中的节点总数为n,节点重启需要O(n)个时间,并且节点重启需要固定时间。我希望优化此ansible作业的执行,使重新启动节点的任务在集群中串行执行,但在集群中并行执行,从而产生与集群中最大主机数成比例的有效重新启动时间。给定库存的示例-

[Cluster_1]
host_1_a
host_1_b

[Cluster_2]
host_2_a
host_2_b

[Cluster_3]
host_3_a
host_3_b
host_3_c
当前执行时间为7*(重新启动时间),我希望将其优化为3*(重新启动时间)。我不确定这在ansible中是否可行,并欢迎提出任何建议。谢谢

Ansible playbook重新启动服务:

-名称:滚动重新启动
主持人:全部
序列号:1
收集事实:不
任务:
-名称:停止服务
服务:
姓名:xyz
状态:停止
-名称:启动服务
服务:
姓名:xyz
国家:开始
-名称:等待服务启动
uri:
url:“http://localhost:8081/node-健康“
方法:获取
注册:http\u状态
直到:http_status.status==200
重试次数:60次
延误:10

一种非常简单的方法是为每个集群并行启动一次playbook。这实际上是我首选的解决方案

ansible-playbook -i inventory -l Cluster_1 playbook.yml 2>&1 > mylog1.txt &
ansible-playbook -i inventory -l Cluster_2 playbook.yml 2>&1 > mylog2.txt &
ansible-playbook -i inventory -l Cluster_3 playbook.yml 2>&1 > mylog3.txt &
同时,如果您真的想在一次运行中保持这一点,这里有一个(可能的开始)解决方案。其思想是动态创建一个服务器列表,混合现有集群服务器列表。请注意,这绝对不是防弹的,使其完全可扩展可能会以噩梦告终

这里是无论如何,如果这可以给你一些想法。关键是使用创建列表,然后映射以删除空值并展平最终结果

---
-名称:创建一个动态组,从每个群集混合主机
主机:本地主机
收集事实:错误
任务:
-添加\u主机:
名称:“{{item}}”
组:
-所有簇都是叠瓦状的
循环:{groups['Cluster_1']| zip_longest(groups['Cluster_2'],groups['Cluster_3'])|列表|映射('select')|映射('list')|展平}
-名称:在所有集群上连续循环
主持人:所有集群
收集事实:错误
序列号:3
任务:
-调试:
msg:我将重新启动主机{{inventory\u hostname}
其中给出了您当前的示例库存:

PLAY [Create a dynamic group mixing hosts from each cluster] ***************************************************************************************************************************************************************************

TASK [add_host] ************************************************************************************************************************************************************************************************************************
changed: [localhost] => (item=host_1_a)
changed: [localhost] => (item=host_2_a)
changed: [localhost] => (item=host_3_a)
changed: [localhost] => (item=host_1_b)
changed: [localhost] => (item=host_2_b)
changed: [localhost] => (item=host_3_b)
changed: [localhost] => (item=host_3_c)

PLAY [Loop serially over all clusters] *************************************************************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [host_1_a] => {
    "msg": "I would restart host host_1_a"
}
ok: [host_2_a] => {
    "msg": "I would restart host host_2_a"
}
ok: [host_3_a] => {
    "msg": "I would restart host host_3_a"
}

PLAY [Loop serially over all clusters] *************************************************************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [host_1_b] => {
    "msg": "I would restart host host_1_b"
}
ok: [host_2_b] => {
    "msg": "I would restart host host_2_b"
}
ok: [host_3_b] => {
    "msg": "I would restart host host_3_b"
}

PLAY [Loop serially over all clusters] *************************************************************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [host_3_c] => {
    "msg": "I would restart host host_3_c"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
host_1_a                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_1_b                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_2_a                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_2_b                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_3_a                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_3_b                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_3_c                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

您能否给出一个当前在所有主机之间进行串行操作的示例剧本?不确定这是否对您有帮助,但请注意串行操作不仅仅是一个是/否,您还可以在每个批次中有多个主机,或者使用数组和百分比控制批次:@Andyshin添加了剧本