Управление выполнением плейбуков: стратегии и многое другое
По умолчанию Ansible выполняет каждую задачу на всех хостах, затронутых плейбуком, прежде чем начать следующую задачу на любом хосте, используя 5 потоков. Если вы хотите изменить это поведение по умолчанию, вы можете использовать другой плагин стратегии, изменить количество потоков или применить один из нескольких ключевых слов, таких как serial.
Выбор стратегии
Поведение по умолчанию, описанное выше, — это линейная стратегия. Ansible предлагает другие стратегии, включая стратегию отладки (см. также Отладка задач) и свободную стратегию, которая позволяет каждому хосту выполнять до конца плейбука как можно быстрее:
- hosts: all strategy: free tasks: ...
Вы можете выбрать другую стратегию для каждого плейбука, как показано выше, или установить предпочитаемую стратегию глобально в ansible.cfg, в секции defaults:
[defaults] strategy = free
Все стратегии реализованы как плагины стратегий. Для получения подробной информации о работе каждого плагина стратегии ознакомьтесь с документацией.
Установка количества потоков
Если у вас есть достаточная вычислительная мощность и вы хотите использовать больше потоков, вы можете установить количество в ansible.cfg:
[defaults] forks = 30
или передать его в командной строке: ansible-playbook -f 30 my_playbook.yml.
Использование ключевых слов для управления выполнением
Помимо стратегий, на выполнение плейбука также влияют несколько ключевых слов. Вы можете установить число, процент или список чисел хостов, которыми вы хотите управлять за раз, с помощью serial. Ansible завершает плейбук на указанном количестве или проценте хостов перед началом следующей группы хостов. Вы можете ограничить количество рабочих процессов, выделенных для блока или задачи, с помощью throttle. Вы можете управлять тем, как Ansible выбирает следующий хост в группе для выполнения с помощью order. Вы можете выполнить задачу на одном хосте с помощью run_once. Эти ключевые слова не являются стратегиями. Это директивы или опции, применяемые к плейбуку, блоку или задаче.
Установка размера пакета с serial
По умолчанию Ansible работает параллельно со всеми хостами в шаблоне, который вы задаете в поле hosts: каждого плейбука. Если вы хотите управлять только несколькими машинами за раз, например, во время развертывания поэтапного обновления, вы можете определить, сколько хостов Ansible должен обрабатывать за один раз, используя ключевое слово serial:
---
- name: test play
hosts: webservers
serial: 3
gather_facts: False
tasks:
- name: first task
command: hostname
- name: second task
command: hostname
В приведенном выше примере, если у нас было 6 хостов в группе ‘webservers’, Ansible полностью выполнит плейбук (обе задачи) на 3 из хостов, прежде чем перейти к следующим 3 хостам:
PLAY [webservers] **************************************** TASK [first task] **************************************** changed: [web3] changed: [web2] changed: [web1] TASK [second task] *************************************** changed: [web1] changed: [web2] changed: [web3] PLAY [webservers] **************************************** TASK [first task] **************************************** changed: [web4] changed: [web5] changed: [web6] TASK [second task] *************************************** changed: [web4] changed: [web5] changed: [web2] PLAY RECAP *********************************************** web1 : ok=2 changed=2 unreachable=0 failed=0 web2 : ok=2 changed=2 unreachable=0 failed=0 web3 : ok=2 changed=2 unreachable=0 failed=0 web4 : ok=2 changed=2 unreachable=0 failed=0 web5 : ok=2 changed=2 unreachable=0 failed=0 web6 : ok=2 changed=2 unreachable=0 failed=0
Вы также можете указать процент с помощью ключевого слова serial. Ansible применяет процент к общему количеству хостов в плейбуке для определения количества хостов на итерацию:
--- - name: test play hosts: webservers serial: "30%"
Если количество хостов не делится на количество итераций без остатка, последняя итерация содержит остаток. В этом примере, если у вас было 20 хостов в группе webservers, первый пакет будет содержать 6 хостов, второй пакет — 6 хостов, третий пакет — 6 хостов, а последний пакет — 2 хоста.
Вы также можете указать размеры пакетов в виде списка. Например:
---
- name: test play
hosts: webservers
serial:
- 1
- 5
- 10
В приведенном выше примере первый пакет будет содержать один хост, следующий — 5 хостов, а (если хосты остались) каждый последующий пакет будет содержать либо 10 хостов, либо все оставшиеся хосты, если их осталось меньше 10.
Вы можете перечислить несколько размеров пакетов как проценты:
---
- name: test play
hosts: webservers
serial:
- "10%"
- "20%"
- "100%"
Вы также можете комбинировать значения:
---
- name: test play
hosts: webservers
serial:
- 1
- 5
- "20%"
Примечание
Независимо от того, насколько мал процент, количество хостов на итерацию всегда будет 1 или больше.
Ограничение выполнения с throttle
Ключевое слово throttle ограничивает количество рабочих процессов для конкретной задачи. Его можно задавать на уровне блока и задачи. Используйте throttle для ограничения задач, которые могут быть ресурсоемкими или взаимодействовать с API, имеющим лимиты скорости:
tasks: - command: /path/to/cpu_intensive_command throttle: 1
Если вы уже ограничили количество потоков или количество машин для параллельного выполнения, вы можете уменьшить количество рабочих процессов с throttle, но не можете увеличить его. Другими словами, чтобы иметь эффект, ваша настройка throttle должна быть ниже, чем ваша настройка forks или serial , если вы используете их вместе.
Порядок выполнения, основанный на инвентаризации
Ключевое слово order управляет порядком выполнения хостов. Возможные значения для order:
- inventory:
-
(по умолчанию) Порядок, предоставленный в инвентаризации
- reverse_inventory:
-
Обратный порядок, предоставленный инвентаризацией
- sorted:
-
Сортировка в алфавитном порядке по имени
- reverse_sorted:
-
Сортировка по имени в обратном алфавитном порядке
- shuffle:
-
Случайный порядок при каждом запуске
Другие ключевые слова, влияющие на выполнение плейбука, включают ignore_errors, ignore_unreachable, и any_errors_fatal. Эти параметры документированы в Обработке ошибок в плейбуках.
Выполнение на одном компьютере с run_once
Если вы хотите, чтобы задача выполнялась только на первом хосте в вашем пакете хостов, установите run_once в значение true для этой задачи:
---
# ...
tasks:
# ...
- command: /opt/application/upgrade_db.py
run_once: true
# ...
Ansible выполняет эту задачу на первом хосте в текущем пакете и применяет все результаты и факты ко всем хостам в том же пакете. Этот подход аналогичен применению условного оператора к задаче, например:
- command: /opt/application/upgrade_db.py when: inventory_hostname == webservers[0]
Однако, с помощью run_once, результаты применяются ко всем хостам. Чтобы запустить задачу на определенном хосте, а не на первом хосте в пакете, делегируйте задачу:
- command: /opt/application/upgrade_db.py run_once: true delegate_to: web01.example.org
Как всегда при делегировании, действие будет выполнено на делегированном хосте, но информация по-прежнему относится к исходному хосту в задаче.
Примечание
При совместном использовании с serial, задачи, помеченные как run_once , будут выполняться на одном хосте в каждом пакете. Если задача должна выполняться только один раз независимо от режима serial , используйте конструкцию when: inventory_hostname == ansible_play_hosts_all[0].
Примечание
Любое условие (другими словами, when:) будет использовать переменные «первого хоста», чтобы определить, выполняется ли задача или нет, другие хосты не будут проверены.
Примечание
Если вы хотите избежать поведения по умолчанию по установке факта для всех хостов, установите delegate_facts: True для конкретной задачи или блока.
См. также
- Введение в плейбуки
-
Введение в плейбуки
- Управление местом выполнения задач: делегирование и локальные действия
-
Выполнение задач на определенных машинах или назначение фактов определенным машинам
- Роли
-
Организация плейбуков по ролям
- Список рассылки пользователей
-
У вас есть вопрос? Загляните в группу Google!
- irc.freenode.net
-
IRC-чат-канал #ansible
© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/user_guide/playbooks_strategies.html