
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/serial
haben 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.