如何在Ansible中用json_query过滤解析LVM快照JSON输出
问题:筛选并提取以snapshot结尾的LVM快照信息
我需要解析Ansible获取的LVM逻辑卷信息,筛选出名称以snapshot结尾的快照卷,并提取出卷名和对应的卷组名,最终生成如下格式的列表:
av_root_snapshot vg_root av_var_snapshot vg_root
现有获取LVM信息的Playbook代码:
- name: lvs debug: msg: "{{ ansible_lvm.lvs }}"
执行后输出的JSON结果:
ok: [localhost] => { "msg": { "av_root_snapshot": { "size_g": "4.00", "vg": "vg_root" }, "av_var_snapshot": { "size_g": "5.00", "vg": "vg_root" }, "lv_root": { "size_g": "20.00", "vg": "vg_root" }, "lv_var": { "size_g": "15.00", "vg": "vg_root" } } }
我已经能通过json_query('*.vg')获取所有卷的vg值,但不知道如何筛选出名称以snapshot结尾的根对象并提取对应信息,需要实现此功能来删除这些快照。
解决方案
方法一:利用json_query正则筛选
通过JSONPath的match函数匹配键名以snapshot结尾的条目,直接提取并拼接所需内容:
- name: 筛选快照信息 debug: msg: "{{ ansible_lvm.lvs | json_query('keys(@)[?match(@, `.*snapshot$`)] | [].{name: @, vg: ansible_lvm.lvs[@].vg} | [].join(` `, [name, vg])') }}"
方法二:使用dict2items结合过滤器
先将字典转为键值对列表,再用正则筛选目标条目,最后拼接成指定格式:
- name: 筛选快照信息 debug: msg: "{{ ansible_lvm.lvs | dict2items | selectattr('key', 'regex', 'snapshot$') | map('extract', ['key', 'value.vg']) | map('join', ' ') }}"
用于删除快照的完整示例
如果要将结果存入变量并执行删除操作,可以这样写:
- name: 提取待删除的快照列表 set_fact: snapshots_to_remove: "{{ ansible_lvm.lvs | dict2items | selectattr('key', 'regex', 'snapshot$') }}" - name: 删除LVM快照 command: lvremove -f "{{ item.value.vg }}/{{ item.key }}" loop: "{{ snapshots_to_remove }}"
内容的提问来源于stack exchange,提问作者pilipeet
相关产品推荐
相关产品推荐

