Ответ
Идемпотентность — это ключевой принцип Ansible, обеспечивающий безопасность и предсказуемость конфигурации. Это означает, что выполнение плейбука или роли несколько раз подряд приводит систему в одно и то же целевое состояние, независимо от её начального состояния.
Почему это критически важно для DevOps:
- Надёжность и безопасность: Вы можете без риска перезапускать плейбуки для исправления ошибок или применения обновлений. Система не сломается из-за повторного выполнения.
- Консистентность инфраструктуры (Infrastructure as Code): Гарантирует, что все серверы в группе будут приведены к идентичной конфигурации, что является основой управляемой и масштабируемой инфраструктуры.
- Поддержка и отладка: Легче понять, что делает роль, так как её эффект детерминирован.
Пример идемпотентного модуля apt:
- name: Ensure nginx package is installed
ansible.builtin.apt:
name: nginx
state: present
Модуль проверит, установлен ли пакет. Если да — ничего не делает. Если нет — установит. Результат после любого количества запусков: nginx в состоянии present.
Пример НЕидемпотентного действия (которого следует избегать):
- name: Append a line to a config file (non-idempotent)
ansible.builtin.shell: echo "ServerName localhost" >> /etc/apache2/apache2.conf
Этот таск будет добавлять одну и ту же строку в файл при каждом запуске, что является изменением состояния. Вместо этого следует использовать идемпотентный модуль lineinfile или шаблонизацию (template).