Как происходит отладка Ansible кода

«Как происходит отладка Ansible кода» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для отладки Ansible плейбуков и ролей я использую комбинацию встроенных инструментов и методологии.

Основные подходы:

  1. Детализированный вывод (-v, -vvv, -vvvv):

    ansible-playbook site.yml -i inventory/prod -vvv

    Уровень -vvv показывает детали выполнения задач и значения переменных, -vvvv включает информацию о подключении.

  2. Пробный запуск (--check --diff):

    ansible-playbook deploy.yml --check --diff

    Режим --check (dry-run) показывает, какие изменения были бы внесены, а --diff выводит различия в конфигурационных файлах.

  3. Модуль 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 }}"
  4. Локальная отладка с connection: local:

    - hosts: localhost
      connection: local
      tasks:
        - name: Test logic locally
          debug:
            var: some_calculated_variable

    Это позволяет проверить логику и фильтры Jinja2 без подключения к целевым хостам.

  5. Стратегическое использование тегов (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".

  6. Логирование в файл: Настройка в ansible.cfg:

    [defaults]
    log_path = ./ansible.log
  7. Модуль 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.