Переменные и шаблоны
Тема дорожной карты · Ansible
Переменные и шаблоны — два взаимодополняющих инструмента Ansible, вместе обеспечивающих полностью динамическую, независимую от среды автоматизацию. Переменные хранят именованные значения — определённые в inventory, group_vars/, host_vars/, defaults role или передаваемые через --extra-vars — и используются в playbook и аргументах задач с синтаксисом Jinja2 {{ variable_name }}. Шаблоны расширяют эту концепцию на целые файлы: модуль ansible.builtin.template рендерит исходный файл .j2 на управляющем узле, подставляя все выражения {{ }} и вычисляя управляющие блоки {% if %} / {% for %}, а затем копирует отрендеренный результат на управляемый хост. Этот паттерн является стандартным способом генерации конфигураций виртуальных хостов nginx, unit-файлов systemd или конфигурационных файлов приложений, различающихся между средами, при сохранении единственного источника истины в системе контроля версий.
Как это работает
Переменные и шаблоны покрывает приоритет переменных (CLI > playbook > role defaults > inventory) — в доке 22 уровня, но на практике нужно несколько. Шаблоны на Jinja2 ({{ var }}, {% if %}, фильтры default, to_json, regex_replace). Модуль template рендерит Jinja2-файл с переменными и копирует на таргет. lookup-плагины читают из внешних источников (file, env, password, csvfile, redis).
Когда применять
Держите переменные организованными: group_vars/all.yml — cross-environment дефолты, group_vars/<env>.yml — env-override, host_vars/<host>.yml — host-специфика. Jinja2-шаблоны — для конфиг-файлов (nginx.conf, application.yml); намного чище цепочек lineinfile. Фильтр default(value) — для безопасных fallback. Избегайте глубокого вложенного precedence — дебаг "какое значение выиграло" болезненный.
Типичные ошибки
Ловушки Переменные и шаблоны: переменные в нескольких местах без явного победителя ("я же поставил в inventory!"); ошибки Jinja2 в шаблонах, работающие в dev и валящиеся в prod из-за undefined var (strict undefined ловит); коммит рендеренных шаблонов в git (пишите Jinja-источник, не output); не знают про hostvars для cross-host ссылок.