← Назад к вопросам

Если в одном Playbook прописано три задачи, сколько задач он обработает

1.0 Junior🔥 251 комментариев
#Ansible и управление конфигурацией

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Анализ вопроса о количестве задач в Ansible Playbook

Вопрос кажется простым, но его точный ответ зависит от нескольких ключевых факторов: определения "задачи" в контексте Ansible, понимания структуры Playbook и механизма его выполнения.

Основной ответ: Три задачи

Если в Playbook явно прописано три отдельных задания с использованием модулей tasks, то при стандартном, линейном выполнении, он обработает именно три задачи.

Пример Playbook с тремя задачами:

---
- name: Пример Playbook с тремя задачами
  hosts: all
  tasks:
    - name: Первая задача - создать директорию
      ansible.builtin.file:
        path: /tmp/test_dir
        state: directory

    - name: Вторая задача - установить пакет
      ansible.builtin.package:
        name: nginx
        state: present

    - name: Третья задача - запустить сервис
      ansible.builtin.service:
        name: nginx
        state: started

При запуске такого Playbook (ansible-playbook playbook.yml) Ansible выполнит каждую из трех задач последовательно на всех целевых хостах (или на хостах, соответствующих шаблону hosts: all).

Важные детали и исключения

Количество фактически обработанных задач может отличаться от трех в следующих случаях:

  1. Целевые хосты (hosts).
    *   Если в разделе `hosts` указана группа, содержащая несколько серверов, то **каждая задача будет выполнена на каждом хосте**. Таким образом, общее количество "единиц работы" (выполнений модуля) будет равно: `3 задачи * N хостов`.
    *   Если группа пуста или не существует, задачи могут не быть выполнены вообще.

  1. Условное выполнение (when).
    Если задачи содержат условие `when`, они могут быть пропущены.
```yaml
tasks:
  - name: Эта задача выполнится только на Debian
    package:
      name: nginx
      state: present
    when: ansible_facts['os_family'] == "Debian"
```

3. Использование циклов (loop, with_items).

    Одна задача с циклом обрабатывает множество элементов. С точки зрения логики Playbook это одна задача, но с точки зрения исполнения модуля — множество раз.
```yaml
tasks:
  - name: Создать несколько пользователей (одна задача в Playbook, но много операций)
    ansible.builtin.user:
      name: "{{ item }}"
      state: present
    loop:
      - user1
      - user2
      - user3
```
    Здесь Playbook содержит одну задачу, но она будет "обработана" трижды (для каждого элемента списка).

  1. Ошибки и режимы выполнения.
    *   Если выполнение задачи завершается с ошибкой и Playbook запущен в стандартном режиме (без `--force`), последующие задачи могут не быть выполнены.
    *   Использование `ignore_errors: yes` позволяет продолжить выполнение после неудачи.

  1. Повторное использование через include_tasks или import_tasks.
    Если одна из трех задач — это включение другого файла с задачами, фактическое количество обработанных задач увеличится.
```yaml
tasks:
  - name: Задача 1
    debug:
      msg: "Первая"
  - name: Включить внешний файл с задачами
    ansible.builtin.include_tasks: "external_tasks.yml"
  - name: Задача 3
    debug:
      msg: "Третья"
```
    В этом случае Playbook обработает задачи: 1, все задачи из `external_tasks.yml`, и 3.

Подытожим

Прямой ответ на вопрос: Если в одном Playbook прописано три задачи в блоке tasks, он обработает три задачи в рамках одного "plays" для каждого целевого хоста.

Но в практике DevOps важно понимать, что под "обработкой" часто подразумевается более широкий контекст:

  • Количество фактических операций на хостах может быть больше из-за циклов и количества хостов.
  • Реальное количество выполненных модулей может быть меньше из-за условий (when) или ошибок.

Таким образом, вопрос проверяет не только базовое знание синтаксиса Ansible, но и понимание его динамической природы и механизмов выполнения. Для точного подсчета "обработанных задач" в сложных сценариях необходимо анализировать весь Playbook, включая директивы hosts, loop, when, и стратегии выполнения (serial, max_fail_percentage).