如何在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
相关产品推荐
相关产品推荐

