Tags
Тема дорожной карты · Ansible
Теги в Ansible — это метки метаданных, прикрепляемые к задачам, role или целым play, позволяющие выборочно запускать или пропускать задачи, что значительно ускоряет итерацию при разработке конфигураций. Использование тегов позволяет инженерам запускать только необходимые шаги конфигурации на уже подготовленном хосте, вместо того, чтобы каждый раз воспроизводить полный playbook. Это не только экономит время, но и снижает вероятность ошибок при тестировании и внесении изменений.
Как это работает
Tags — это стандартная единица в Ansible, представляющая собой YAML-файл, содержащий список play. Каждый play состоит из hosts, tasks, опционально pre_tasks, post_tasks, handlers и vars. Задачи выполняются последовательно для каждого хоста, а handlers выполняются в конце play только при активации триггера (notify). Strategy управляет параллелизмом: linear (дефолт — ждет медленный хост), free (каждый хост выполняется так быстро, как это возможно). Tags позволяют запускать подмножества задач (--tags backup), а опция --start-at-task позволяет возобновить выполнение после сбоя.
Когда применять
Всегда оборачивайте связанные операции в плейбук, даже если вы начинаете с одной задачи. Используйте pre_tasks для выполнения операций setup, которые должны идти первыми. Handlers используются для реализации идиомы "перезапустить X, если конфигурация изменилась". Tags позволяют запускать только определенные задачи или пропускать их. Для постепенной выкатки (canary) используйте serial: 1 или serial: 25%. Также можно использовать --check --diff для тестирования в CI на основе staging-inventory.
Типичные ошибки
Одной из распространенных ловушек при использовании тегов является длинный плейбук без использования тегов, что требует запуска всего плейбука для тестирования одной секции. Также часто используется ignore_errors: true повсюду, что может привести к тихим сбоям. Необходимо использовать блоки block + rescue + always для обработки ошибок. Ошибки отступов YAML могут вызвать проблемы, поэтому рекомендуется использовать линтер, такой как ansible-lint. Наконец, использование become: true на уровне play, когда требуется root-доступ только для одной задачи, может привести к нежелательным последствиям.