Spec-Zone.ru › Ansible 2.9

Асинхронные действия и опрос

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

Операции в фоновом режиме с ограничением по времени

Вы можете выполнять длительные операции в фоновом режиме и проверять их статус позже. Например, чтобы выполнить long_running_operation асинхронно в фоновом режиме с таймаутом в 3600 секунд (-B), и без опроса (-P):

$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"

Если вы хотите проверить статус задачи позже, вы можете использовать модуль async_status, передав ему идентификатор задачи, который был возвращен при запуске исходной задачи в фоновом режиме:

$ ansible web1.example.com -m async_status -a "jid=488359678239.2844"

Чтобы выполнить задачу в течение 30 минут и опросить статус каждые 60 секунд:

$ ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"

Режим опроса умный, поэтому все задачи будут запущены до начала опроса на любом компьютере. Убедитесь, что вы установили достаточно высокое значение --forks, если хотите, чтобы все ваши задачи стартовали очень быстро. После истечения лимита по времени (в секундах) (-B), процесс на удаленных узлах будет завершен.

Обычно вы будете запускать в фоновом режиме только длительные командные интерпретаторы или обновления программного обеспечения. Запуск модуля копирования в фоновом режиме не выполняет передачу файлов в фоновом режиме. Плейбуки также поддерживают опрос и имеют упрощенную синтаксическую конструкцию для этого.

Чтобы избежать проблем с блокировкой или таймаутом, вы можете использовать асинхронный режим для одновременного выполнения всех задач, а затем опрашивать, пока они не завершатся.

Поведение асинхронного режима зависит от значения poll.

Избегайте таймаутов соединения: poll > 0

Когда poll имеет положительное значение, плейбук все еще будет блокироваться на задаче до ее завершения, ошибки или таймаута.

В этом случае, однако, async явным образом задает таймаут, который вы хотите применить к этой задаче, а не ограничивается таймаутом метода соединения.

Чтобы запустить задачу асинхронно, укажите ее максимальное время выполнения и частоту опроса статуса. Значение опроса по умолчанию задается настройкой DEFAULT_POLL_INTERVAL, если вы не укажете значение для poll:

---

- hosts: all
  remote_user: root

  tasks:

  - name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec
    command: /bin/sleep 15
    async: 45
    poll: 5

Примечание

По умолчанию нет предела времени для асинхронного выполнения. Если вы опускаете ключевое слово «async», задача выполняется синхронно, что является стандартным поведением Ansible.

Примечание

Начиная с Ansible 2.3, async не поддерживает режим проверки и завершит задачу при запуске в режиме проверки. См. Режим проверки («сухой запуск») о том, как пропустить задачу в режиме проверки.

Конкурентные задачи: poll = 0

Когда poll равно 0, Ansible запустит задачу и сразу перейдет к следующей, не дожидаясь результата.

С точки зрения последовательности это асинхронное программирование: задачи теперь могут выполняться параллельно.

Запуск плейбука завершится без проверки асинхронных задач.

Асинхронные задачи будут выполняться до их завершения, ошибки или таймаута в соответствии со значением async.

Если вам нужна точка синхронизации с задачей, зарегистрируйте ее, чтобы получить ее идентификатор задачи, и используйте модуль async_status, чтобы наблюдать за ней.

Вы можете запустить задачу асинхронно, указав значение опроса 0:

---

- hosts: all
  remote_user: root

  tasks:

  - name: simulate long running op, allow to run for 45 sec, fire and forget
    command: /bin/sleep 15
    async: 45
    poll: 0

Примечание

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

Примечание

Использование более высокого значения для --forks приведет к более быстрому запуску асинхронных задач. Это также повышает эффективность опроса.

Если вы хотите выполнить задачу асинхронно и проверить ее позже, вы можете выполнить задачу, аналогичную следующей:

---
# Requires ansible 1.8+
- name: 'YUM - async task'
  yum:
    name: docker-io
    state: present
  async: 1000
  poll: 0
  register: yum_sleeper

- name: 'YUM - check on async task'
  async_status:
    jid: "{{ yum_sleeper.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 30

Примечание

Если значение async: недостаточно велико, это приведет к ошибке задачи «проверить позже», так как временный файл статуса, который ищет async_status:, не будет создан или больше не будет существовать.

Если вы хотите запустить несколько асинхронных задач, ограничив количество одновременно выполняемых задач, вы можете сделать это так:

#####################
# main.yml
#####################
- name: Run items asynchronously in batch of two items
  vars:
    sleep_durations:
      - 1
      - 2
      - 3
      - 4
      - 5
    durations: "{{ item }}"
  include_tasks: execute_batch.yml
  loop: "{{ sleep_durations | batch(2) | list }}"

#####################
# execute_batch.yml
#####################
- name: Async sleeping for batched_items
  command: sleep {{ async_item }}
  async: 45
  poll: 0
  loop: "{{ durations }}"
  loop_control:
    loop_var: "async_item"
  register: async_results

- name: Check sync status
  async_status:
    jid: "{{ async_result_item.ansible_job_id }}"
  loop: "{{ async_results.results }}"
  loop_control:
    loop_var: "async_result_item"
  register: async_poll_results
  until: async_poll_results.finished
  retries: 30

См. также

О плейбуках
Введение в плейбуки
Список рассылки пользователей
У вас есть вопрос? Задайте его на форуме!
irc.freenode.net
Чат канала IRC #ansible

© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.9/user_guide/playbooks_async.html

Spec-Zone.ru

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