我有一堆Oracle数据库服务器的清单。大多数时候,我希望我的剧本能够并行执行。但是对于一组特定的RAC服务器,我想确保Ansible可以串行处理它们。因此,我的清单如下所示。请注意,这只是一个示例,实际上有170多个主机是独立服务器和RAC的混合,因此理想情况下该解决方案是可扩展的:
[d1w1]
server1
server2
[d1w2]
hostA
hostB
[d1w3]
standalone1
standalone2
rac1
rac2
rac3
在这种情况下,当我为“ d1w3”运行ansible-playbook时,该Playbook将同时开始为所有5台主机执行。我需要它同时执行standalone1,standalone2和rac1。当rac1成功完成后,继续前进到rac2;当rac2成功完成后,继续前进到rac3。
我知道组和子级,但是我不确定如何建立依赖关系。
有什么想法吗?
答案 0 :(得分:0)
我建议考虑在同一本剧本中制作多部戏剧。每次播放将在已定义的hosts
上的前一个播放之后进行。
- name: parallel play on 3 hosts
hosts: standalone1,standalone2,rac1
tasks:
- name: tasks 1
…
- name: play on rac2
hosts: rac2
tasks:
- name: tasks 1
…
- name: play on rac3
hosts: rac3
tasks:
- name: tasks 1
…
答案 1 :(得分:0)
您可能必须进行重组,但仍然可以让主机文件定义。
[parallels]
1.2.3.4
1.2.3.5
[serials]
2.3.4.5
2.3.4.6
2.3.4.7
然后您可以分成几个剧本-
- name: Do The Thing
hosts: parallels
roles:
- test
- name: Do The Thing in serial
hosts: serials
serial: 1
roles:
- test
那可能仍然不是您想要的,但是如果将其与baptistemm的解决方案结合使用,它可能会起作用。依赖性有多深?
如果将所有必须先完成的工作放在一个组中,然后将所有依赖于第二个组的工作,然后将所有依赖 2nd 组的工作放入第三,您可以并行处理所有波浪1,然后是波浪2,然后是波浪3,等等。
您可能必须使用--limit
语句,但是它可以工作。