Что такое условия в Ansible playbook?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Условия в Ansible Playbook: Контроль выполнения задач
В Ansible условия (conditionals) — это механизм, позволяющий контролировать, должна ли выполняться конкретная задача, роль, блок задач или даже весь playbook, основываясь на определённых факторах. Это ключевой элемент для создания гибких, адаптивных и интеллектуальных конфигураций, которые реагируют на состояние управляемых узлов (managed nodes).
Основной инструмент для реализации условий — это модуль when, который применяется на уровне задачи. Его логика прост: задача выполняется только если выражение в when оценивается как true.
Основные типы условий и синтаксис
1. Базовые условия с when
Выражение может проверять переменные (факты, пользовательские переменные, результаты предыдущих задач), сравнения и логические операции.
tasks:
- name: "Установить Apache только на веб-серверы"
ansible.builtin.package:
name: apache2
state: present
when: ansible_facts['role'] == 'web_server'
2. Комбинирование условий с логическими операторами
Можно использовать and, or, а также группировку скобками.
tasks:
- name: "Перезапустить службу при изменении конфига и если она запущена"
ansible.builtin.service:
name: nginx
state: restarted
when:
- nginx_config_changed # Переменная, установленная в предыдущей задаче с `register`
- ansible_facts['services']['nginx']['state'] == 'running'
3. Условия на основе регистрированных результатов (register)
Часто условие зависит от результата выполнения предыдущей задачи (её stdout, stdout_lines, rc (return code), changed).
tasks:
- name: "Проверить наличие файла конфигурации"
ansible.builtin.stat:
path: /etc/app/config.yml
register: config_stat
- name: "Скопировать дефолтный конфиг, если файл отсутствует"
ansible.builtin.copy:
src: /files/default_config.yml
dest: /etc/app/config.yml
when: not config_stat.stat.exists
4. Условия с фактами (ansible_facts)
Факты (facts) — это автоматически собираемая информация о целевом узле (ОС, IP-адресы, диски, память). Это один из самых мощных источников для условий.
tasks:
- name: "Установить EPEL репозиторий только для CentOS/RHEL 7"
ansible.builtin.yum:
name: epel-release
state: present
when:
- ansible_facts['distribution'] == 'CentOS' or ansible_facts['distribution'] == 'RedHat'
- ansible_facts['distribution_major_version'] == '7'
5. Условия с использованием тестов (tests)
Ansible предоставляет набор тестов (jinja2 tests), таких как defined, undefined, even, odd, version, которые можно использовать в when.
tasks:
- name: "Выполнить миграцию, если определена переменная db_version"
command: /opt/app/migrate.sh
when: db_version is defined
Практическое применение и важность
- Разделение конфигурации по ролям узлов: Один playbook может обслуживать разные типы серверов (web, db, cache), устанавливая соответствующие пакеты и конфиги.
- Идемпотентность и безопасность: Задачи, изменяющие состояние (например, перезапуск службы), выполняются только при необходимости (
when: service_state_changed), избегая ненужных воздействий. - Обработка ошибок и альтернативные пути: Можно выполнить задачу-"запасной вариант", если основная не выполнилась (
when: result.rc != 0). - Условное выполнение блоков задач (
block) и целых ролей (roles): Условия можно применять не только к задачам, но и к блокам (группам задач) или ролям, что позволяет включать/выключать целые логические модули конфигурации.
Условия — это то, что превращает статический список команд из playbook в динамическую программу управления конфигурацией, способную "думать" и принимать решения на основе реального состояния инфраструктуры. Без них Ansible был бы гораздо менее мощным инструментом для DevOps, требующим создания множества отдельных, узкоспециализированных playbook для каждого возможного сценария.