Ansible-Schlüsselwort - Throttle

Ansible-Schlüsselwort - Throttle

Ich versuche, das Schlüsselwort „Throttle“ zu verwenden und zu verstehen, wie es funktioniert.

Unten sehen Sie, wie ich es verwende (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

Hingerichtetansible-playbook --inventory some-inventory --limit host1:host2:host3

Ich erwarte, dass bei der Aufgabe(Nacheinander ausführen), alle in --limit angegebenen Hosts werden nacheinander ausgeführt, d. h. Host1 führt alle Aufgaben im Block aus, dann Host2, gefolgt von Host3

Sie werden jedoch parallel ausgeführt (Standardverhalten von Ansible).

Kann jemand zum Verständnis beitragenGaspedalVerhalten? Habe ich eine Konfiguration übersehen?

forks/serialhaben Standardwerte.

Und wie kann ich sequentielles Verhalten erreichen?

Antwort1

Der StandardVerhaltenvonAnsible-Spielbuchist derlineare Strategie:

Die Aufgabenausführung erfolgt im Gleichschritt pro Host-Batch, wie definiert durchseriell (Standard: alle)Bis zumGabelgrenzeder Hosts werden ausgeführtjede Aufgabe gleichzeitigund dann die nächste Reihe von Gastgebernbis der Stapel fertig ist, bevor mit der nächsten Aufgabe fortgefahren wird.

Gaspedaldient dem Zweck, „Begrenzung der Anzahl der Mitarbeiter für eine bestimmte Aufgabe ... Verwenden Sie die Drosselung, um Aufgaben einzuschränken, die möglicherweise CPU-intensiv sind oder mit einer ratenbegrenzenden API interagieren".

Beispielsweise wird die Aufgabe standardmäßig überhaupt nicht parallel ausgeführt (begrenzt durchseriellbis zumGabeln) Gastgeber

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

Sie können sehen, dass alle Hosts die Aufgabe parallel ausgeführt haben

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

Wenn Sie die Ausführung einschränken durchGaspedal

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

Sie können sehen, dass die Ausführung der Aufgabe serialisiert wurde

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

Stellen Sie sicher, dass die Zeit synchronisiert wurde, bevor Sie mit dem Experimentieren beginnen.


Q:"Bei Verwendung von include_tasks erreiche ich nicht das gleiche Verhalten. Alle enthaltenen Tasks werden parallel ausgeführt."

A: Ich kann Ihr Problem nicht reproduzieren. Angesichts der Dateien

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 }}"

die Aufgabe

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

gibt

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

Sie können sehen, dass die Ausführung der enthaltenen Aufgaben serialisiert wurde. Dies funktioniert wie erwartet, da das SchlüsselwortGaspedalist erlaubt in derBlockDie Anwendung eines solchen Schlüsselworts auf einen Block ist dasselbe wie die Anwendung dieses Schlüsselworts auf alle Aufgaben im Block.

verwandte Informationen