Ansible按列表date属性排序取最新项报错如何解决
错误原因
原代码存在两个核心问题:
- 循环逻辑完全多余:需求是对整个快照列表排序取最新值,根本不需要遍历列表每一项。加了
loop配置后,每次循环拿到的item是列表里的单个字典元素,不是完整的目标列表。 - 过滤器作用对象错误:
sort是列表专属过滤器,仅能对列表类型数据生效。你把单个字典元素传给sort,还指定按date属性排序,解释器自然会报「单个对象没有可排序的date属性」的错误,和你看到的报错信息完全对应。
修正方法
去掉多余的loop配置,直接对整个sort_list列表执行排序、取最后一项的操作即可,修正后的任务代码:
- debug: msg="{{ sort_list }}" - debug: msg: "{{ _latest.snap_name }}" vars: _latest: "{{ sort_list | sort(attribute='date') | last }}"
补充说明:你的
date字段是YYYYMMDDHHMMSS格式的定长数字字符串,字符串字典序排序结果和实际时间先后顺序完全一致,不需要额外做日期类型转换,排序后取最后一个元素就是日期最新的条目。
如果想要更高效的写法(不需要对全列表做排序),可以直接用max过滤器取date值最大的条目:
- debug: msg: "{{ (sort_list | max(attribute='date')).snap_name }}"
执行后就能拿到预期结果:aaa-bbb-ccc-data-sb-20220604020004。
内容的提问来源于stack exchange,提问作者Philip Shangguan
相关产品推荐
相关产品推荐

