Условия (when)
Тема дорожной карты · Ansible
Условие when в Ansible управляет тем, выполняется ли задача, вычисляя Jinja2-выражение перед запуском задачи на каждом хосте. Если выражение оценивается как false, задача пропускается и фиксируется в выводе play без вызова ошибки. Типичный паттерн — when: ansible_os_family == "Debian" для применения задач, специфичных для ОС, или when: result.rc != 0 для реакции на код возврата предыдущей задачи, зарегистрированной через register: result. Несколько условий можно объединить в список YAML под when:, где элементы списка неявно связаны через AND; для логики OR используется Jinja2-выражение с or. Условия взаимодействуют с loop: выражение when вычисляется независимо для каждой итерации цикла, обеспечивая детальный контроль на уровне отдельных элементов в рамках одной задачи.
Как это работает
Условия (when) — стандартная единица: YAML-файл со списком play; у каждого play — hosts, tasks, опционально pre_tasks/post_tasks/handlers/vars/roles. Задачи бегут последовательно per host; handlers — в конце play, только при триггере (notify). Strategy управляет параллелизмом: linear (дефолт — ждёт медленный), free (каждый хост так быстро, как может). Tags позволяют гонять подмножества (--tags backup); --start-at-task возобновляет после сбоя.
Когда применять
Всегда оборачивайте связанные операции в плейбук — даже если начинаете с одной задачи, растёт. pre_tasks — для setup, который должен идти первым; handlers — для идиомы "перезапустить X, если конфиг изменился"; tags — для частичных запусков. serial: 1 или serial: 25% — для постепенной выкатки (canary). Тестируйте --check --diff в CI против staging-inventory.
Типичные ошибки
Ловушки Условия (when): длинные плейбуки без tags (нужно гонять всё для теста одной секции); ignore_errors: true повсюду (тихие сбои); нет block + rescue + always для error handling; баги отступов YAML (используйте линтер — ansible-lint); become: true на уровне play, когда нужен root только для одной задачи.