8. Observability и Debugging: verbose, debug, callback plugins, profiling
Как поддерживать и чинить Ansible‑автоматизацию: правильно использовать verbosity (-v/-vvv), debug, callback plugins, логирование и профилирование playbooks. В конце — практики: найти/починить flaky playbook и ускорить медленный deploy. В разделе — небольшие примеры кода с комментариями и production best practices.
Verbosity (-v, -vv, -vvv)
Уровни детализации:
-v— базовая доп. информация-vv— больше деталей (включая результаты модулей)-vvv— максимально подробно (может содержать чувствительные данные при неосторожных задачах)
ansible-playbook -i inventories/prod/hosts.ini site.yml -v
ansible-playbook -i inventories/prod/hosts.ini site.yml -vv
ansible-playbook -i inventories/prod/hosts.ini site.yml -vvv
Production best practices:
- в CI для production избегать
-vvvбез необходимости - на задачах с секретами всегда
no_log: true(см. раздел 4)
Debug module
debug помогает быстро увидеть значения переменных, ветвление when и результаты register.
- name: Show computed values
ansible.builtin.debug:
msg:
- "env={{ env }}"
- "host={{ inventory_hostname }}"
- "os={{ ansible_facts['os_family'] }}"
Для сложных структур:
- name: Dump var
ansible.builtin.debug:
var: some_complex_var
Production best practices:
- не выводить секреты через debug
- временный debug удалять после фикса (или прятать за tag
debugи не запускать в prod)
Callback plugins
Callback plugins влияют на формат вывода и могут давать профилирование/тайминги.
Пример: включить тайминги задач (profile_tasks)
В ansible.cfg:
[defaults]
callbacks_enabled = profile_tasks
Это добавит в вывод длительность каждой задачи — удобно для ускорения медленных плейбуков.
Production best practices:
- включать
profile_tasksв CI (или локально) для оптимизации - для production логов выбирать формат, который удобно парсить (например, json callback — если используете централизованное логирование)
Логирование
В ansible.cfg:
[defaults]
log_path = ./ansible.log
Production best practices:
- не писать логи в общий артефакт CI, если есть риск секретов (даже с маскированием)
- ограничивать доступ к логам, хранить ретеншн
no_log: trueна чувствительных задачах
Profiling playbooks (ускорение)
Что чаще всего замедляет:
- сбор фактов на каждом запуске (gather_facts) при большом флоте
- слишком маленький
forks - лишние
shellи команды, которые можно заменить модулем - отсутствие
serialи неэффективный порядок задач
Пример: ускорить за счёт forks и отключения фактов
# forks: больше параллельности (с осторожностью)
ansible-playbook -i inventories/prod/hosts.ini site.yml --forks 30
- name: Fast play (facts off)
hosts: web
gather_facts: false
tasks:
- name: Ping
ansible.builtin.ping:
Комментарий: gather_facts: false использовать только если play действительно не зависит от фактов.
Практика: найти и исправить “flaky” playbook
Типовые причины flaky:
- задачи зависят от таймингов (сервис ещё не поднялся, файл ещё не появился)
- нет retries/until для внешних зависимостей
- неидемпотентные shell‑команды
Пример: заменить sleep на retries/until
- name: Wait for service health
ansible.builtin.uri:
url: "http://127.0.0.1:8080/health"
method: GET
status_code: 200
register: hc
retries: 10
delay: 3
until: hc.status == 200
Практика: ускорить медленный deploy
Шаги:
- включить
profile_tasksи найти топ самых медленных задач - убрать лишний
gather_facts(где возможно) или ограничить facts (subset) - увеличить
forksи/или использоватьserialдля контролируемого rolling - параллелить долгие операции через async/poll (см. раздел 6)
Production best practices (сводка)
profile_tasksдля анализа времени- аккуратное использование
-vvvиdebug(не светить секреты) - retries/until вместо sleep
- корректная параллельность (
forks,serial) под лимиты инфраструктуры