如何在Ansible中按长度+字母顺序排序Linux块设备列表?
在Ansible中按名称长度+字母顺序排序Linux块设备
我需要对通过ansible_facts获取的Linux块设备名称进行排序,要求先按名称长度排序(短名称在前,比如sda、sdb…sdz,之后是sdaa、sdab这类长名称),同一长度内按字母顺序排列。但直接用Ansible的sort过滤器得到的是字典序结果,导致sdaa排在sdb之前,不符合预期。
- 预期排序结果:
sda, sdb, sdc, ..., sdaa, sdab, ..., sdbb - 当前错误排序结果:
sda, sdaa, sdab, sdac ..., sdb, sdba, sdbb, sdbc, ...
解决方案:自定义排序键
Ansible的sort过滤器支持通过key参数指定排序规则,我们可以生成一个包含名称长度和名称本身的元组作为排序依据,这样就能实现先按长度排序、同长度再按字母排序的需求。
示例Playbook
- name: 测试块设备排序 hosts: your_host gather_facts: yes tasks: - name: 提取并排序块设备名称 set_fact: sorted_block_devices: "{{ ansible_facts.devices.keys() | sort(key=lambda x: (x | length, x)) }}" - name: 打印排序结果 debug: var: sorted_block_devices
逻辑说明
ansible_facts.devices.keys():从facts里提取所有块设备的名称列表sort(key=lambda x: (x | length, x)):定义排序的优先级:- 先比较设备名称的长度,短名称排在前面
- 长度相同时,再按名称的字母顺序排序
执行这个Playbook后,输出的sorted_block_devices就会完全符合预期的排序规则。
内容的提问来源于stack exchange,提问作者leesangwoo
相关产品推荐
相关产品推荐

