Ответ
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), который выполнится всегда, даже если цель уже достигнута.
Хотя задачи в плейбуке выполняются последовательно (что может создавать впечатление императивности), внутренняя логика каждой задачи и модуля остается декларативной и идемпотентной.