Почему в Ansible нельзя использовать полностью декларативный подход во всех плейбуках?

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

Ответ

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

  • Условное выполнение задач: Использование when, changed_when, failed_when для принятия решений на основе состояния системы.
  • Обработка данных и регистрация переменных: Операция register для захвата вывода команды и последующая манипуляция этим выводом — это классическая императивная последовательность.
  • Циклы: Конструкции loop, with_items для итерации по спискам.
  • Контроль порядка выполнения: Хотя Ansible старается быть идемпотентным, некоторые операции (например, обновление кэша пакетов перед установкой) требуют явного указания последовательности через блоки или теги.

Пример: Задача, которая должна выполняться только при изменении, требует явной проверки.

- name: Install Nginx
  ansible.builtin.apt:
    name: nginx
    state: present
  register: nginx_install_result
  # Императивная проверка зарегистрированной переменной
  changed_when: nginx_install_result.changed

Таким образом, Ansible — это гибридная модель, где декларативно описывается целевое состояние, а императивные элементы управляют процессом его достижения.