← Назад к вопросам

Что такое условия в Ansible playbook?

2.0 Middle🔥 222 комментариев
#Ansible и управление конфигурацией

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Условия в 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 для каждого возможного сценария.