在 Ansible 中,Jinja2 是一个非常常用的模板引擎。默认情况下,Ansible使用Jinja2来渲染模板。但是,有时候会出现怪异行为,特别是在使用了 jinja2_native=True 后。
jinja2_native 实际上是一个编译器选项,可以用来提高渲染性能(尤其是在循环和递归时)。然而,在某些情况下,它也可能会导致意外的行为。
例如,在使用 group_vars 或 host_vars 时,可能会出现以下错误:
: 'AnsibleUndefined' object has no attribute 'attr'
这个错误是由于 jinja2_native = True 将变量值缓存到本地变量中,从而不再动态地解析它们的属性。这会导致在 group_vars 或 host_vars 文件中定义的变量无法访问其他 Ansible 变量的属性。
为避免这种bug,可以在Ansible配置文件中禁用 jinja2_native,方式如下:
[defaults]
jinja2_native=False
这将禁用 jinja2_native 缓存,以便动态解析变量值。更好的解决方法是避免在 group_vars 或 host_vars 中尝试访问其他变量的属性。
如果您仍然想在特定部分启用 jinja2_native,则可以使用以下代码:
- hosts: localhost
vars:
j2_native: True
tasks:
- name: Example
template:
src: example.j2
dest: /etc/example.conf
vars:
j2_native: False
这将在所有任务中默认启用 jinja2_native,但在模板任务中将其禁用。
上一篇:Ansible:静默设置事实