Ключевое слово 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-playbookэтолинейная стратегия:

Выполнение задач происходит в соответствии с пакетом хоста, как определеносерийный (по умолчанию все). Вверх кпредел вилкихостов будет выполнятькаждая задача одновременноа затем следующая серия хостовпока партия не будет готова, прежде чем перейти к следующей задаче.

дроссельслужит цели "ограничение количества рабочих процессов для определенной задачи... Используйте дроссель для ограничения задач, которые могут быть ресурсоемкими или взаимодействовать с 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

Вы можете видеть, что выполнение включенных задач было сериализовано. Это работает так, как и ожидалось, потому что ключевое словодроссельразрешено вблокировать. Применение такого ключевого слова к блоку аналогично применению этого ключевого слова ко всем задачам в блоке.

Связанный контент