使用fork变量,我可以告诉anes应该并行执行多少个主机。当之前的所有主机都完成时,将执行下一个主机。如果主机上的执行时间不同,我必须等待最后一个主机完成。
是否可以告诉一个主机完成(不是全部运行)后,下一台主机的下一播放。
换句话说,我有数百个客户端,其播放时间是5分钟,有些主机需要30分钟。我们测试了叉子的数量,发现50是一个很好的值。有时接下来的50个主机必须等待一台主机25分钟。
答案 0 :(得分:1)
Q:“是否可以在一个主机完成之后告诉ansible开始下一台主机的下一场比赛?”
A :是。这是可能的。您正在寻找策略插件host_pinned。报价:
Ansible在等待已完成主机的下一个任务排队之前,不会等待其他主机完成当前任务。主持人完成播放后,将其打开到等待开始的新主持人的位置。
示例
让我们创建库存
$ cat hosts
all:
hosts:
test_01:
wait_timeout: 1
test_02:
wait_timeout: 2
test_03:
wait_timeout: 3
test_06:
wait_timeout: 4
test_09:
wait_timeout: 5
下面的剧本
$ cat pinned-01.yml
- name: Play A
hosts: all
gather_facts: false
strategy: host_pinned
tasks:
- debug:
msg: "A:{{ inventory_hostname }}
{{ lookup('pipe', 'date +%H-%M-%S') }}
started"
- wait_for:
timeout: "{{ wait_timeout }}"
- debug:
msg: "A:{{ inventory_hostname }}
{{ lookup('pipe', 'date +%H-%M-%S') }}
finished"
给予
$ ansible-playbook pinned-01.yml -f 3 | grep msg\":
"msg": "A:test_06 15-33-05 started"
"msg": "A:test_09 15-33-05 started"
"msg": "A:test_01 15-33-05 started"
"msg": "A:test_01 15-33-08 finished"
"msg": "A:test_02 15-33-08 started"
"msg": "A:test_06 15-33-11 finished"
"msg": "A:test_03 15-33-11 started"
"msg": "A:test_02 15-33-11 finished"
"msg": "A:test_09 15-33-12 finished"
"msg": "A:test_03 15-33-15 finished"
结果
由于-f 3
Ansible启动了3台主机(1,9,6)。主机1首先完成,opened it's slot to a new host that was waiting to start
完成。主机2已启动。主机6完成之后,主机3便以相同的方式启动。主机2在主机9之后启动,在主机9之前完成。