Ansible キーワード - スロットル

Ansible キーワード - スロットル

スロットル キーワードがどのように機能するかを理解し、使用しようとしています。

以下は私がそれを使用している方法です (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

含まれているタスクの実行がシリアル化されていることがわかります。これは、キーワードスロットルは許可されていますブロックこのようなキーワードをブロックに適用することは、このキーワードをブロック内のすべてのタスクに適用することと同じです。

関連情報