Найти в Дзене
Infra as Code по-русски

Ansible переменные: простыми словами (Часть 1)

Переменные в Ansible — это простой способ один раз задать значение и использовать его где угодно. В этой статье простыми словами разбираем ansible переменные: как их объявлять и применять, как подставлять значения через Jinja2, работать со списками и словарями, а ещё объединять конфигурации с помощью фильтров combine и приёма merge variables. Подойдёт новичкам и тем, кто хочет навести порядок в плейбуках без лишнего «магического» синтаксиса. Переменная — это «коробочка с ярлыком». Ярлык (имя) должен быть удобным и понятным. Можно: Нельзя/нежелательно: Про ведущий _: так иногда помечают «внутренние»/временные переменные: _tmp_dir. Это всего лишь договорённость. Они не приватные — к ним можно обратиться как к обычным Итог: пишем коротко и по смыслу: env_name, nginx_workers, backup_enabled. Самый базовый случай — строка, число или булево значение. Jinja2 — это «шаблонный язык», который Ansible понимает в двойных фигурных скобках. Переменную можно использовать в любом поле, где Ansible ож
Оглавление

Анотация

Переменные в Ansible — это простой способ один раз задать значение и использовать его где угодно. В этой статье простыми словами разбираем ansible переменные: как их объявлять и применять, как подставлять значения через Jinja2, работать со списками и словарями, а ещё объединять конфигурации с помощью фильтров combine и приёма merge variables. Подойдёт новичкам и тем, кто хочет навести порядок в плейбуках без лишнего «магического» синтаксиса.

Допустимые имена переменных

Переменная — это «коробочка с ярлыком». Ярлык (имя) должен быть удобным и понятным.

Можно:

  • буквы латиницей, цифры и подчёркивания: app_port, db_user1, _internal_timeout;
  • начинать с буквы или подчёркивания.

Нельзя/нежелательно:

  • начинать с цифры: 1port ❌;
  • дефисы и точки: app-port, db.user ❌ (лучше app_port, db_user);
  • пробелы и спецсимволы: var with space, var@home ❌.

Про ведущий _: так иногда помечают «внутренние»/временные переменные: _tmp_dir. Это всего лишь договорённость. Они не приватные — к ним можно обратиться как к обычным

Итог: пишем коротко и по смыслу: env_name, nginx_workers, backup_enabled.

Простые переменные

Самый базовый случай — строка, число или булево значение.

-2

Ссылки на переменные (Jinja2)

Jinja2 — это «шаблонный язык», который Ansible понимает в двойных фигурных скобках.

-3

Переменную можно использовать в любом поле, где Ansible ожидает значение: when, with_items, в шаблонах, в именах файлов.

Когда заключать переменные в кавычки

Кавычки нужны, чтобы YAML не перепутал типы и символы.

Обязательно ставим кавычки, если:

  • строка похожа на число/булево: "yes", "on", "01" (иначе yes/on станут true, 01 — числом);
  • есть двоеточие, собачка, решётка, амперсанд и т. п.: "user:pass", "email@host", "a&b";
  • дата: "2025-01-02" (иначе YAML может распознать это как дату и поменять тип);
  • внутри строки используете подстановку: "https://{{ domain }}".
Правило дня: сомневаетесь — кавычки не повредят. Для интерполяции чаще используем двойные.

Списки переменных

Список — это упорядоченный набор значений.

-4

Обращаемся к элементу по индексу:

-5

Где полезно: перечни пакетов, порты, список каталогов для бэкапа.

Переменные-словари

Словарь (dict) — это «имя → значение». Вложенность поддерживается.

-6

Обращение:

-7

Где полезно: настройки сервисов, пользователи, сервисы с параметрами.

Как объединять списки и словари

Списки:

  • сложение: list1 + list2;
  • уникализация: | unique;
  • пересечение/разность: | intersect(list2), | difference(list2).
-8

Словари: используем фильтр combine:

-9

community.general.merge_variables — объединяем по маске

Иногда переменные раскиданы по файлам/группам и названы по паттерну: web_packages_base, web_packages_ubuntu, web_packages_prod. Удобно собрать их одним lookup’ом.

Требуется коллекция community.general.
-10

Тот же приём работает и для словарей (объединение ключей):

-11

Важно: имена выдерживайте единообразно (prefix_... или ..._suffix) и явно задавайте pattern_type — prefix или suffix.

Почему это работает

  • YAML понимает типы (числа, булево, даты), поэтому иногда мы защищаем строку кавычками.
  • Jinja2 подставляет значения в момент выполнения задачи — так одна переменная может ссылаться на другую.
  • Фильтры (unique, combine) и lookup’и (merge_variables) позволяют собирать итоговые значения из кусочков: удобно для разных окружений и ролей.

Что сделали

  • Разобрались с именами и простыми переменными.
  • Посмотрели списки и словари, научились к ним обращаться.
  • Научились объединять значения: от + и unique до combine и merge_variables.

Сделать прямо сейчас

  • Переименуйте пару старых переменных в читаемый вид (app_port, db_host).
  • Вынесите списки пакетов в переменные и соберите общий список через + | unique.
  • Попробуйте combine для словарей (дефолты + прод-override).
  • Установите коллекцию community.general и протестируйте merge_variables.

CTA

Если было полезно — подпишитесь. В следующей части разберём где хранить переменные (vars, group_vars, host_vars), приоритеты и типичные грабли.