如何在Ansible中过滤ansible_devices提取holders和size字段?
解决Ansible ansible_devices提取分区holders和size的问题
先明确ansible_devices的数据结构
ansible_devices是多层嵌套字典,核心结构逻辑如下:
- 顶层key是设备名称(如
sda、sdb) - 每个设备对应的value是包含该设备属性的字典,其中
partitions字段又是一个子字典 partitions的key是分区名称(如sda1),value是包含holders、size等字段的分区属性字典
示例结构片段:
{ "sda": { "partitions": { "sda1": { "holders": [], "size": "1073741824", "fstype": "ext4" }, "sda2": { "holders": ["dm-0"], "size": "21474836480", "fstype": "LVM2_member" } }, "size": "214748364800" }, "nvme0n1": { # 非sd开头设备的属性 } }
正确的字段提取方法
方法1:用json_query一次性提取(推荐)
核心是先把字典转成列表(dict2items),再逐层筛选和提取:
- name: 提取sd开头设备分区的holders和size debug: msg: "{{ ansible_devices | dict2items | selectattr('key', 'match', '^sd') | json_query('[].value.partitions | dict2items | [].{分区名: key, 挂载持有者: value.holders, 容量: value.size}') }}"
解释:
dict2items:把顶层设备字典转成[{key: 设备名, value: 设备属性}]的列表selectattr('key', 'match', '^sd'):筛选出key以sd开头的设备项json_query:遍历每个设备的partitions,先转成列表,再提取需要的字段并自定义输出键名
方法2:用循环+set_fact构建结果
适合需要分步处理的场景:
- name: 初始化分区信息列表 set_fact: partition_list: [] - name: 遍历sd设备的分区,提取目标字段 set_fact: partition_list: "{{ partition_list + [{ 'partition': item.key, 'holders': item.value.holders, 'size': item.value.size }] }}" loop: "{{ ansible_devices | dict2items | selectattr('key', 'match', '^sd') | json_query('[].value.partitions | dict2items') | flatten }}" - name: 打印结果 debug: var: partition_list
常见报错原因
- 直接对字典用selectattr:
selectattr是针对列表的过滤器,字典必须先通过dict2items转成列表才能使用 - json_query路径错误:没有注意到
partitions是字典,必须用dict2items转成列表后才能遍历提取字段 - 忽略嵌套层级:没有从设备层级深入到
partitions子字典,直接尝试提取分区字段导致路径不存在
内容的提问来源于stack exchange,提问作者dfs
相关产品推荐
相关产品推荐

