Ответ
Для отладки Ansible плейбуков и ролей я использую комбинацию встроенных инструментов и методологии.
Основные подходы:
-
Детализированный вывод (
-v,-vvv,-vvvv):ansible-playbook site.yml -i inventory/prod -vvvУровень
-vvvпоказывает детали выполнения задач и значения переменных,-vvvvвключает информацию о подключении. -
Пробный запуск (
--check --diff):ansible-playbook deploy.yml --check --diffРежим
--check(dry-run) показывает, какие изменения были бы внесены, а--diffвыводит различия в конфигурационных файлах. -
Модуль
debugдля инспекции переменных:- name: Display all variables for a host debug: var: hostvars[inventory_hostname] run_once: true - name: Debug a specific fact debug: msg: "The OS is {{ ansible_distribution }} {{ ansible_distribution_version }}" -
Локальная отладка с
connection: local:- hosts: localhost connection: local tasks: - name: Test logic locally debug: var: some_calculated_variableЭто позволяет проверить логику и фильтры Jinja2 без подключения к целевым хостам.
-
Стратегическое использование тегов (
tags):tasks: - name: Configure Nginx template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf tags: - nginx - configЗапуск только отладочных задач:
ansible-playbook playbook.yml --tags "debug,setup". -
Логирование в файл: Настройка в
ansible.cfg:[defaults] log_path = ./ansible.log -
Модуль
assertдля валидации условий:- name: Ensure required variable is set assert: that: - db_password is defined - db_password | length >= 12 fail_msg: "Database password is not defined or too weak."
Для сложных сценариев я временно добавляю pause задачи или разбиваю сложные jinja2 выражения на несколько шагов с debug.