Ansible расширяет шаблонные ключи по запросу из магического контекстного словаря, который он передает Jinja, когда Jinja запрашивает их, однако Jinja рано связывает любое имя, на которое ссылается шаблон, до начала какой-либо обработки.
Jinja ожидает контекстчтобы получить конкретное значение или эквивалент KeyError
(«Undefined» IIRC), Ansible OTOH использует этот момент для рекурсивного вызова Jinja, чтобы построить значение для передачи в исходный вызов шаблона.Именно в этом рекурсивном вызове происходит ваша ошибка.
Может быть полезно взглянуть на необработанный источник Jinja для похожего шаблона (подготовленного с jinja2.Environment().compile(..., raw=True)
:
from __future__ import division
from jinja2.runtime import LoopContext, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join, to_string, identity, TemplateNotFound, Namespace
name = None
def root(context, missing=missing, environment=environment):
resolve = context.resolve_or_missing
undefined = environment.undefined
if 0: yield None
l_0_foo = resolve('foo')
l_0_groups = resolve('groups')
pass
if environment.getattr((undefined(name='groups') if l_0_groups is missing else l_0_groups), 'group1'):
pass
yield to_string((undefined(name='foo') if l_0_foo is missing else l_0_foo))
blocks = {}
debug_info = '1=12'
Уведомлениекак вызовы resolve()
завершаются до того, как произойдет какая-либо условная оценка. В resolve()
Ansible пытается рекурсивно расширить вашу переменную foo
.
Должна быть возможность настроить все так, чтобы foo
раскрывается только в том случае, если Джинджа попытается преобразовать его в строку (или аналогичную), поэтому я бы посоветовал оставить вышестоящую ошибку.