如何在Ansible中获取非根设备的volume_id并过滤非/dev/sda1的EBS卷
解决Ansible过滤非根EBS卷并获取volume_id的问题
我看了你的playbook和变量结构,问题出在两个关键地方:一是你把when条件放错了位置,二是对volumes变量的结构理解有误,导致过滤逻辑完全不生效。下面一步步给你修正:
原脚本的核心错误
when条件时机错误:你把when写在了ec2_vol任务上,这时候volumes变量还没被注册(这个任务本身才会生成并注册volumes),所以这个条件根本起不到过滤作用。- 字段访问路径错误:根据你提供的
volumes变量结构,每个卷的设备名存在attachment_set.device字段里,而不是volumes.device_name——而且volumes本身是包含所有卷列表的结果对象,你需要遍历volumes.volumes这个列表来处理单个卷。
修正后的Playbook
- name: 获取实例挂载的所有EBS卷 ec2_vol: region: "{{ aws_vars.region }}" instance: "{{ ec2.instances[0].instance_id }}" state: list register: volumes - name: 过滤非根设备并输出volume_id列表 debug: msg: "{{ volumes.volumes | selectattr('attachment_set.device', '!=', '/dev/sda1') | map(attribute='id') | list }}"
关键逻辑解释
- 先完整获取所有卷:第一步先拉取实例上的全部EBS卷,注册到
volumes变量中,这一步不需要任何过滤条件。 - 用过滤器链实现精准过滤:在
debug任务里,通过Ansible的过滤器组合完成两个核心操作:selectattr('attachment_set.device', '!=', '/dev/sda1'):从卷列表中筛选出设备名不是/dev/sda1的非根卷map(attribute='id') | list:把筛选后的卷对象提取出id字段,转换成纯ID列表
注意事项
如果你的实际环境中,卷的设备名字段不是attachment_set.device(比如部分场景下字段是device_name),请先通过debug: var=volumes任务确认变量结构,再调整selectattr里的字段路径。
内容的提问来源于stack exchange,提问作者Tomer Leibovich
相关产品推荐
相关产品推荐

