Jinja2 3.1.2模板语法报错及修复方案咨询
Jinja2版本兼容问题修复方案
在Jinja2 3.1.2版本中执行以下代码会抛出语法异常:
>>> print(jinja2.Template("{{ '%04d' | format(0777 - '0022' | int) }}").render())
报错信息:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 1208, in __new__ return env.from_string(source, template_class=cls) File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 1105, in from_string return cls.from_code(self, self.compile(source), gs, None) File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 768, in compile self.handle_exception(source=source_hint) File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 936, in handle_exception raise rewrite_traceback_stack(source=source) File "<unknown>", line 1, in template jinja2.exceptions.TemplateSyntaxError: expected token ',', got 'integer'
但同样的代码在Jinja2 2.11.3版本中可正常运行,输出结果为0755:
>>> print(jinja2.Template("{{ '%04d' | format(0777 - '0022' | int) }}").render()) 0755
该问题源于Jinja2对表达式运算符优先级的调整,原代码中管道符|与减号-的优先级解析在新版本中发生变化,导致表达式被错误解析。
针对你的Ansible角色配置,只需为管道转换部分添加括号,明确运算优先级即可修复:
修改前的配置:
deploy_cakephp_default_umask: '0022' deploy_cakephp_default_owner: root deploy_cakephp_default_group: root deploy_cakephp_default_directory_mode: "{{ '%04d' | format(0777 - deploy_cakephp_default_umask | int) }}" deploy_cakephp_default_file_mode: "{{ '%04d' | format(0666 - deploy_cakephp_default_umask | int) }}"
修改后的配置:
deploy_cakephp_default_umask: '0022' deploy_cakephp_default_owner: root deploy_cakephp_default_group: root deploy_cakephp_default_directory_mode: "{{ '%04d' | format(0777 - (deploy_cakephp_default_umask | int)) }}" deploy_cakephp_default_file_mode: "{{ '%04d' | format(0666 - (deploy_cakephp_default_umask | int)) }}"
通过将deploy_cakephp_default_umask | int用括号包裹,确保先完成字符串转整数的操作,再执行减法运算,即可在Jinja2 3.1.2及以上版本中正常运行。
内容的提问来源于stack exchange,提问作者tersmitten
相关产品推荐
相关产品推荐

