Spec-Zone.ru › Ansible 2.11

Управление выполнением плейбуков: стратегии и многое другое

По умолчанию Ansible выполняет каждую задачу на всех хостах, затронутых плейбуком, прежде чем начать следующую задачу на любом хосте, используя 5 потоков. Если вы хотите изменить это поведение по умолчанию, вы можете использовать другой плагин стратегии, изменить количество потоков или применить один из нескольких ключевых слов, таких как serial.

  • Выбор стратегии
  • Установка количества потоков
  • Использование ключевых слов для управления выполнением

    • Установка размера пакета с serial
    • Ограничение выполнения с throttle
    • Порядок выполнения, основанный на инвентаризации
    • Выполнение на одном компьютере с run_once

Выбор стратегии

Поведение по умолчанию, описанное выше, — это линейная стратегия. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API