Ansible Playbook动态赋值变量后无法输出,报Jinja模板错误
Ansible Playbook变量赋值与模板错误修复
核心问题分析
你的Playbook存在三处关键语法/逻辑错误:
- 文件查找时的变量嵌套写法错误
- 引用动态命名变量时未使用
vars字典获取实际值 blockinfile模块的模板语法混乱
修正后的Playbook
- name: get contents of local file set_fact: "{{ item.filename }}": "{{ lookup('file', 'files/conf/' ~ item.name ~ '.zip') }}" loop: "{{ genericconf }}" - name: encode to base64 set_fact: "{{ item.basename }}": "{{ vars[item.filename] | b64encode }}" loop: "{{ genericconf }}" - name: add lines blockinfile: block: |4 "{{ vars[item.basename] }}" path: "/opt/try/{{ item.name }}.name" insertafter: "configuration: >-" marker: "" loop: "{{ genericconf }}"
逐任务修正说明
获取文件内容任务:
原写法'files/conf/{{ item.name }}.zip'在Jinja模板中嵌套变量会导致解析异常,改用字符串拼接符~连接路径,确保变量被正确解析为实际文件名。Base64编码任务:
原写法'{{ item.filename }}' |b64encode只是对字符串item.filename本身编码,而非对应变量的值。需用vars[item.filename]通过变量名动态获取之前设置的事实变量值,再执行编码操作。写入文件任务:
原模板语法"{{ {{ item.basename')} }}"存在引号、括号匹配错误,修正为"{{ vars[item.basename] }}",通过vars字典获取动态命名的编码后变量值,同时保证语法合规。
额外提示
确保genericconf是包含filename、basename、name键的字典列表,键名需完全匹配,避免因拼写错误导致变量无法找到。
内容的提问来源于stack exchange,提问作者madhanmgk
相关产品推荐
相关产品推荐

