如何开发Ansible过滤器插件实现字典中嵌套列表的双层objectId排序?
嗨,我来帮你搞定这个双层排序的需求!你现在的过滤器确实只完成了顶层列表的排序,没处理每个父对象里的members子列表。咱们调整一下插件代码,让它同时搞定两层的排序。
修改后的过滤器插件代码
class FilterModule(object): def filters(self): return { 'sortbysubkey': self.sortbysubkey, } def sortbysubkey(self, items_to_sort, sorting_key): # 先对顶层列表按指定key排序 sorted_top_level = sorted(items_to_sort, key=lambda item: item[sorting_key]) # 遍历每个顶层元素,对其members列表也按相同key排序 for item in sorted_top_level: if 'members' in item and isinstance(item['members'], list): item['members'] = sorted(item['members'], key=lambda member: member[sorting_key]) return sorted_top_level
代码逻辑解释
- 第一步:先和之前一样,用
sorted()对顶层的列表按传入的sorting_key(也就是objectId)排序,得到排序后的顶层列表。 - 第二步:遍历每个顶层元素,检查它是否包含
members键,并且members是列表类型(做个容错处理更稳妥),然后对members列表也用同样的sorting_key进行排序,把排序后的结果重新赋值给item['members']。 - 最后返回处理好的双层排序后的列表。
验证Playbook用法
你的Playbook代码不用改,还是原来的写法:
- ansible.builtin.debug: msg: "{{ test | sortbysubkey('objectId') }}"
运行之后,就能得到你想要的结果:顶层父对象按objectId排序,每个父对象里的members列表也按objectId从小到大排列。
这样修改后,就完美实现了你要的双层排序需求啦!
内容的提问来源于stack exchange,提问作者Belabacsi
相关产品推荐
相关产品推荐

