
Я пытаюсь использовать и понять, как работает ключевое слово 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
Вы можете видеть, что выполнение включенных задач было сериализовано. Это работает так, как и ожидалось, потому что ключевое словодроссельразрешено вблокировать. Применение такого ключевого слова к блоку аналогично применению этого ключевого слова ко всем задачам в блоке.