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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:25:25