Spec-Zone.ru › Ansible 2.4

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

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

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

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

Чтобы запустить задачу асинхронно, укажите её максимальное время выполнения и частоту опроса состояния. Значение опроса по умолчанию составляет 10 секунд, если вы не укажете другое значение для 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.

В качестве альтернативы, если вам не нужно ждать завершения задачи, вы можете «отправить и забыть», указав значение опроса 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

Примечание

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

Примечание

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

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

---
# Requires ansible 1.8+
- name: 'YUM - fire and forget task'
  yum: name=docker-io state=installed
  async: 1000
  poll: 0
  register: yum_sleeper

- name: 'YUM - check on fire and forget 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
  with_items:
    - "{{ sleep_durations | batch(2) | list }}"

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

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

См. также

Плейбуки
Вступление в плейбуки
Список рассылки пользователей
Есть вопрос? Обратитесь в группу Google!
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.4/playbooks_async.html

Spec-Zone.ru

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