Blocks и rescue
Тема дорожной карты · Ansible
Блоки в Ansible — это механизм группировки, позволяющий применять общие директивы — when, become, tags или обработку ошибок — к набору задач одновременно, снижая повторяемость и улучшая читаемость playbook. Наиболее важная возможность блоков — структурированная обработка ошибок через секцию rescue, которая выполняется при сбое любой задачи в block, и секцию always, выполняемую независимо от результата, что повторяет семантику try/catch/finally из языков общего назначения. Например, блок может выполнить рискованное развёртывание в block:, откатиться в rescue: и уведомить систему мониторинга в always: — всё как единая логическая единица. Блоки в Ansible нельзя непосредственно обходить в цикле loop, но их можно вкладывать и включать внутри них вызовы include_tasks, что позволяет строить сложные деревья условного выполнения в рамках одного play.
Как это работает
Blocks и rescue — стандартная единица: 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.
Типичные ошибки
Ловушки Blocks и rescue: длинные плейбуки без tags (нужно гонять всё для теста одной секции); ignore_errors: true повсюду (тихие сбои); нет block + rescue + always для error handling; баги отступов YAML (используйте линтер — ansible-lint); become: true на уровне play, когда нужен root только для одной задачи.