Lookup плагины
Тема дорожной карты · Ansible
Lookups в Ansible — это функции на основе плагинов, которые извлекают данные из внешних источников — файлов, переменных окружения, DNS, Redis и других — и возвращают результат в виде значения переменной во время выполнения playbook. Они вызываются с помощью функции lookup(), например lookup('file', '/etc/ssl/ca.crt') для чтения содержимого файла в переменную или lookup('env', 'HOME') для чтения переменной окружения оболочки. Lookup плагины выполняются на управляющем узле Ansible, а не на управляемом хосте, что отличает их от модулей, выполняемых удалённо. Функция query() (или lookup(..., wantlist=True)) является предпочтительной формой, когда lookup возвращает список, обеспечивая единообразное поведение при использовании с loop.
Как это работает
Lookup плагины покрывают приоритет переменных (CLI > playbook > role defaults > inventory) — в документации указано 22 уровня, но на практике нужно несколько. Шаблоны на Jinja2 ({{ var }}, {% if %}, фильтры default, to_json, regex_replace). Модуль template рендерит Jinja2-файл с переменными и копирует на таргет. lookup-плагины читают из внешних источников (file, env, password, csvfile, redis). Они могут быть использованы для динамического получения данных, которые затем используются в playbook.
Когда применять
Держите переменные организованными: 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 — дебаг "какое значение выиграло" болезненный. Lookup плагины особенно полезны при работе с динамическими данными и внешними источниками информации.
Типичные ошибки
Ловушки Lookup плагины: переменные в нескольких местах без явного победителя ("я же поставил в inventory!"); ошибки Jinja2 в шаблонах, работающие в dev и валящиеся в prod из-за undefined var (strict undefined ловит); коммит рендеренных шаблонов в git (пишите Jinja-источник, не output); не знают про hostvars для cross-host ссылок. Эти ошибки могут привести к непредсказуемому поведению и сложностям при отладке.