Ansible 关键字 - 节流阀

Ansible 关键字 - 节流阀

我正在尝试使用并了解 throttle 关键字的工作原理。

下面是我使用它的方法(test-playbook.yaml)。

---
- name: Test throttle
  hosts: all
  
  tasks:

    # list of pre tasks
    
    - name: Execute sequentially
      throttle: 1
      block:
        - include_tasks: task-1.yaml
        
        - include_tasks: task-2.yaml
        
        # a task using some module
        
        # a task using some module

    # list of post tasks

已执行ansible-playbook --inventory some-inventory --limit host1:host2:host3

我期望在任务中(依次执行),--limit 中指定的所有主机将按顺序执行,即 host1 将完成块中的所有任务,然后是 host2,接着是 host3

但它们是并行执行的(默认的 Ansible 行为)。

有人可以帮忙理解风门行为?我是否遗漏了一些配置?

forks/serial有默认值。

以及如何实现顺序行为。

答案1

默认行为ansible-剧本是个线性策略

任务执行按照主机批次同步进行,定义如下串行(默认全部)。 至分叉限制的主机将执行同时执行每项任务接下来是下一系列主持人直到批次完成,再继续下一个任务

风门服务的目的是“限制特定任务的工作人员数量...使用节流阀来限制可能占用大量 CPU 或与速率限制 API 交互的任务“。

例如,默认情况下完全并行执行任务(受串行叉子) 主机

- hosts: host1,host2,host3
  tasks:
    - command: sleep 1
      register: result
    - debug:
        msg: "{{ inventory_hostname }} task1
              {{ result.start }} - {{ result.end }}"

可以看到所有主机并行执行了该任务

ok: [host2] => 
  msg: host2 task1 2021-07-23 08:56:14.735263 - 2021-07-23 08:56:15.759474
ok: [host1] => 
  msg: host1 task1 2021-07-23 08:56:14.743419 - 2021-07-23 08:56:15.759518
ok: [host3] => 
  msg: host3 task1 2021-07-23 08:56:14.475249 - 2021-07-23 08:56:15.551159

如果你限制执行风门

    - command: sleep 1
      register: result
      throttle: 1
    - debug:
        msg: "{{ inventory_hostname }} task2
              {{ result.start }} - {{ result.end }}"

可以看到任务的执行是序列化的

ok: [host2] => 
  msg: host2 task2 2021-07-23 08:56:20.252623 - 2021-07-23 08:56:21.312210
ok: [host3] => 
  msg: host3 task2 2021-07-23 08:56:22.688410 - 2021-07-23 08:56:23.744130
ok: [host1] => 
  msg: host1 task2 2021-07-23 08:56:17.937011 - 2021-07-23 08:56:18.955631

在开始实验之前,请确保时间已经同步。


问:使用include_tasks时,我没有得到相同的行为。所有包含的任务都并行运行。

答:我无法重现你的问题。鉴于文件

shell> ansible --version
ansible 2.10.1

shell> cat test-119-tasks-2.yml
---
- command: sleep 1
  register: result
- debug:
    msg: "{{ inventory_hostname }} task2
          {{ result.start }} - {{ result.end }}"

shell> cat test-119-tasks-3.yml
---
- command: sleep 1
  register: result
- debug:
    msg: "{{ inventory_hostname }} task3
          {{ result.start }} - {{ result.end }}"

任务

    - name: Execute sequentially
      throttle: 1
      block:
        - include_tasks: test-119-tasks-2.yml
        - include_tasks: test-119-tasks-3.yml

给出

TASK [include_tasks] ***********************************************
included: /export/scratch/tmp8/test-119-tasks-2.yml for host1, host2, host3
TASK [command] *****************************************************
changed: [host1]
changed: [host2]
changed: [host3]

TASK [debug] *******************************************************
ok: [host1] => 
  msg: host1 task2 2021-07-25 10:56:11.832219 - 2021-07-25 10:56:12.848834
ok: [host2] => 
  msg: host2 task2 2021-07-25 10:56:14.312498 - 2021-07-25 10:56:15.330202
ok: [host3] => 
  msg: host3 task2 2021-07-25 10:56:16.751018 - 2021-07-25 10:56:17.774723

TASK [include_tasks] ***********************************************
included: /export/scratch/tmp8/test-119-tasks-3.yml for host1, host2, host3

TASK [command] ******************************************************
changed: [host1]
changed: [host2]
changed: [host3]

TASK [debug] ********************************************************
ok: [host1] => 
  msg: host1 task3 2021-07-25 10:56:20.373052 - 2021-07-25 10:56:21.405847
ok: [host2] => 
  msg: host2 task3 2021-07-25 10:56:22.761254 - 2021-07-25 10:56:23.788941
ok: [host3] => 
  msg: host3 task3 2021-07-25 10:56:25.134650 - 2021-07-25 10:56:26.151786

您可以看到所包含任务的执行已序列化。这按预期工作,因为关键字风门允许在堵塞。将该关键字应用到一个块中与将该关键字应用到该块中的所有任务相同。

相关内容