Ansible模板处理字典时无法找到对应key 无法提取path属性问题
Ansible find模块返回结果path属性取值异常修复方案
根因说明
部分Ansible稳定版(2.10及以下版本)中,Jinja2的attr过滤器优先识别变量的原生Python属性,不会主动读取字典类型变量的自定义键值,因此对find模块返回的字典格式文件对象使用attr('path')会出现取值失败的问题。
修复后的代码
- name: Find cert file ansible.builtin.find: file_type: file paths: /etc/ilmaotus patterns: '*_X509.pem' register: cert_files # 可选:增加调试步骤确认中间结果 - name: Debug file object attributes ansible.builtin.debug: msg: "First file path: {{ (cert_files.files | first).path }}" - name: Set cert based facts ansible.builtin.set_fact: device_id: "{{ (cert_files.files | first)['path'] }}"
可选兼容写法
如果需要兼容多版本Ansible,也可以使用map过滤器提前提取属性,写法更简洁:
device_id: "{{ cert_files.files | map(attribute='path') | first }}"
额外排查项
如果调整写法后仍然无法正常取值,可以检查以下配置:
- 确认Ansible执行用户对
/etc/ilmaotus路径有读权限 - 确认playbook全局、当前role中没有重复定义
device_id变量导致覆盖 - 升级ansible-core到2.12以上的长期支持版本,规避低版本Jinja2解析问题
内容的提问来源于stack exchange,提问作者Mikko Jaakkola
相关产品推荐
相关产品推荐

