Какой подход использует Ansible — декларативный или императивный?

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

Ответ

Ansible придерживается декларативной (описательной) модели. В плейбуке вы описываете желаемое конечное состояние системы, а не последовательность команд для его достижения. Движок Ansible сам определяет, нужно ли вносить изменения и какие именно действия для этого выполнить (идемпотентность).

Пример декларативного подхода:

- name: Ensure the web server package is installed
  apt:
    name: nginx
    state: present  # Мы объявляем состояние "установлен", а не команду `apt install`

- name: Ensure the service is running and enabled
  service:
    name: nginx
    state: started
    enabled: yes

Ansible проверит текущее состояние: если пакет уже установлен, задача будет отмечена как ok без изменений. Это контрастирует с императивным подходом, где вы бы написали скрипт с последовательностью команд (apt update && apt install -y nginx), который выполнится всегда, даже если цель уже достигнута.

Хотя задачи в плейбуке выполняются последовательно (что может создавать впечатление императивности), внутренняя логика каждой задачи и модуля остается декларативной и идемпотентной.