Приоритет переменных
Тема дорожной карты · Ansible
Приоритет переменных в Ansible — это 22-уровневая иерархия, определяющая, какое значение «побеждает», когда одно и то же имя переменной определено в нескольких местах. В основании стека (ранг 2) находятся defaults role в defaults/main.yml, созданные для лёгкого переопределения; ближе к вершине (ранг 16) — vars role в vars/main.yml, которые перекрывают большинство переменных inventory и playbook. Наивысший приоритет (ранг 22) принадлежит extra-переменным, передаваемым в командной строке через ansible-playbook site.yml --extra-vars "env=prod db_host=10.0.0.5", — они переопределяют всё без исключений, что делает их полезными для разовых переопределений и параметризации CI/CD. На практике операторам нужно помнить ключевые ориентиры: group_vars и host_vars находятся в середине иерархии, секции vars: play перекрывают inventory, а --extra-vars всегда выигрывает — понимание этих уровней предотвращает наиболее распространённые сессии отладки "почему моя переменная игнорируется?".
Как это работает
Приоритет переменных покрывает приоритет переменных (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 ссылок.