You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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}') }}"

解释:

  1. dict2items:把顶层设备字典转成[{key: 设备名, value: 设备属性}]的列表
  2. selectattr('key', 'match', '^sd'):筛选出key以sd开头的设备项
  3. 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

常见报错原因

  1. 直接对字典用selectattr:selectattr是针对列表的过滤器,字典必须先通过dict2items转成列表才能使用
  2. json_query路径错误:没有注意到partitions是字典,必须用dict2items转成列表后才能遍历提取字段
  3. 忽略嵌套层级:没有从设备层级深入到partitions子字典,直接尝试提取分区字段导致路径不存在

内容的提问来源于stack exchange,提问作者dfs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:20:24