在完成一台主机(不是所有分叉的主机)后,为下一台主机执行一个有趣的剧本

时间:2020-01-23 11:39:06

标签: ansible fork

使用fork变量,我可以告诉anes应该并行执行多少个主机。当之前的所有主机都完成时,将执行下一个主机。如果主机上的执行时间不同,我必须等待最后一个主机完成。

是否可以告诉一个主机完成(不是全部运行)后,下一台主机的下一播放。

换句话说,我有数百个客户端,其播放时间是5分钟,有些主机需要30分钟。我们测试了叉子的数量,发现50是一个很好的值。有时接下来的50个主机必须等待一台主机25分钟。

1 个答案:

答案 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之前完成。