Ansible Jinja2 for循环变量在lookup中作用域失效问题咨询
问题原因
该报错属于预期行为,核心错误是Jinja2 插值语法不能嵌套使用:
你调用lookup函数的代码本身已经包裹在{{ }}表达式块中,块内直接引用变量即可,不需要再加一层{{ }}做插值,嵌套的{{ }}会导致Jinja2解析逻辑混乱,无法正确识别变量。
修正方案
直接使用Jinja2字符串拼接语法拼接路径即可,有两种常用写法:
写法1:用~运算符拼接(推荐,适配所有变量类型)
{% for filename in item.value.filenames %} {{ item.value.filenames[filename] }} #可正常调用 {{ filename }} #可正常调用 {{ lookup('file', '/somedir/' ~ item.value.filenames[filename]) }} # 已修正 {{ lookup('file', '/somedir/' ~ filename) }} # 已修正 {% endfor %}
写法2:用Python风格的字符串格式化
{{ lookup('file', '/somedir/%s' % item.value.filenames[filename]) }} {{ lookup('file', '/somedir/%s' % filename) }}
额外注意事项
Ansible的file lookup默认是在控制节点上读取文件,如果你需要读取目标远程节点上的文件,不能用这个lookup,需要先通过slurp模块拉取远程文件内容再处理。
内容的提问来源于stack exchange,提问作者strugglestreet
相关产品推荐
相关产品推荐

