Ansible切换Python3后Jinja2中dict.items()[0]等效写法咨询
问题解决:Python3下Jinja2中dict.items()无法索引的问题
问题背景
将Ansible控制器从Python2切换到Python3后,原Jinja2模板中的表达式{{ osd['data_devices'].items()[0][0] }}失效,报错:
dict_items object has no element 0
原因是Python3中dict.items()返回的是视图对象而非列表,无法直接通过索引访问元素,而Python2中该方法返回的是列表,可直接索引。
解决方案
方法1:用括号包裹过滤器结果后索引
Jinja2中过滤器的优先级高于索引操作,需先通过list过滤器将items()的结果转为列表,再用括号包裹后进行索引:
{{ (osd['data_devices'].items() | list)[0][0] }}
此表达式可正确获取data_devices字典的第一个键(即paths)。
方法2:直接获取字典的第一个键(更简洁)
观察你的osd_spec结构,data_devices字典中仅包含paths一个键,因此可直接通过keys()结合first过滤器获取目标键,无需处理items():
{{ osd['data_devices'].keys() | first }}
该方式更直观,同时避免了列表转换的额外操作。
验证示例
针对你的osd_spec数据:
osd_spec: - spec_name: osd_spec1 data_devices: paths: - /dev/sdg - /dev/sdh - spec_name: osd_spec2 data_devices: paths: - /dev/sda - /dev/sdb
两种方法均会输出paths,符合预期需求。
内容的提问来源于stack exchange,提问作者alixander
相关产品推荐
相关产品推荐

