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

可以看到包含的任務的執行是序列化的。這按預期工作,因為關鍵字風門允許在堵塞。將此關鍵字套用至區塊與將此關鍵字套用至區塊中的所有任務相同。

相關內容