Ansible中lookup返回含特殊字符密码被Jinja解析引发错误的解决咨询
Ansible Lookup返回含特殊字符密码被Jinja意外解析的解决办法
问题说明
使用Ansible lookup插件获取密码时,若返回的密码包含{%这类Jinja模板语法字符,且lookup的第二个参数为带{{ }}的变量,会触发Jinja错误解析密码内容,抛出类似encountered unknown tag 'Y'的错误,而实际场景中密码应保持原始格式,不被解析。
重现场景
清单变量配置
existing_var: 'just a string' ansible_password: '{{ lookup("mylookup", "{{ existing_var }}") }}'
测试用Lookup插件(需放在Ansible配置指定的lookup目录,命名为mylookup.py)
from __future__ import (absolute_import, division, print_function) __metaclass__ = type from ansible.errors import AnsibleError from ansible.plugins.lookup import LookupBase class LookupModule(LookupBase): def run(self, terms, variables=None, **kwargs): # 固定返回含Jinja特殊语法的字符串 return ["x{g{%Y"]
触发的错误信息
encountered unknown tag 'Y'.. string: {%Y
注意:当lookup的第二个参数为无大括号的普通字符串时,不会出现此问题:
ansible_password: '{{ lookup("mylookup", "simple string without curly braces.")}}'
解决方法
方法1:直接传递变量,避免参数嵌套模板语法
无需在lookup参数中套{{ }},直接传入变量名即可正确传递值,同时避免触发二次解析:
existing_var: 'just a string' ansible_password: '{{ lookup("mylookup", existing_var) }}'
方法2:用!unsafe标记变量,强制跳过解析
在变量定义前添加!unsafe标记,告知Ansible/Jinja保留字符串原始内容,不进行任何模板解析:
ansible_password: !unsafe '{{ lookup("mylookup", "{{ existing_var }}") }}'
方法3:使用raw过滤器包裹lookup结果
在lookup结果后追加| raw过滤器,强制Jinja不解析返回的字符串内容:
ansible_password: '{{ lookup("mylookup", "{{ existing_var }}") | raw }}'
内容的提问来源于stack exchange,提问作者user16115
相关产品推荐
相关产品推荐

