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

如何在Ansible中用json_query筛选关联LVM的复杂JSON磁盘

Ansible解析ansible_devices筛选根文件系统对应设备方案

步骤1:获取根文件系统对应的逻辑卷名称

从ansible_mounts事实中定位根挂载点,提取适配/dev/mapper/xxx格式的LV名称:

- name: 获取根LV名称
  set_fact:
    root_lv: "{{ ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='device') | first | regex_replace('^/dev/mapper/(.*)$', '\\1') }}"

步骤2:筛选包含目标LV的磁盘与分区信息

用dict2items将字典结构的ansible_devices转为可遍历的列表,结合json_query筛选出partitions中holders包含目标LV的项:

- name: 筛选目标设备信息
  set_fact:
    target_partitions: "{{ ansible_devices | dict2items | selectattr('value.partitions', 'defined') | json_query('[].value.partitions | dict2items | [?value.holders[] == `' ~ root_lv ~ '`]') | flatten }}"

步骤3:提取所需字段

遍历筛选结果,提取磁盘名、分区名、物理卷、逻辑卷信息:

- name: 输出目标设备详情
  debug:
    msg: |
      磁盘名: {{ item.key.split('/')[-1] }}
      分区名: {{ item.key }}
      物理卷: {{ item.value.holders | first }}
      逻辑卷: {{ root_lv }}
  loop: "{{ target_partitions }}"

关键说明

  • dict2items:解决Ansible无法直接遍历字典键值对的问题,将字典转为[{key: 键名, value: 键值}, ...]格式的列表
  • json_query中的holders[] ==:匹配列表holders中的任意元素等于目标LV名称,对应jq中any(.holders[]; . == "xxx")的逻辑
  • 若系统中根设备路径格式不是/dev/mapper/xxx,需调整regex_replace规则适配实际路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:35:02