
スロットル キーワードがどのように機能するかを理解し、使用しようとしています。
以下は私がそれを使用している方法です (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
タスク実行は、ホストバッチごとに定義に従って同期されます。シリアル(デフォルトはすべて)。 以下フォーク制限ホストが実行する各タスクを同時にそして次のシリーズのホストバッチが完了するまで、次のタスクに進む前に。
スロットル「特定のタスクのワーカー数を制限する...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 を使用しても同じ動作は得られません。含まれているすべてのタスクは並行して実行されています。「
A: 問題を再現できません。ファイルから
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
含まれているタスクの実行がシリアル化されていることがわかります。これは、キーワードスロットルは許可されていますブロックこのようなキーワードをブロックに適用することは、このキーワードをブロック内のすべてのタスクに適用することと同じです。