如何在Ansible中动态获取根分区对应的设备名(如sda/sdb)
获取根目录挂载设备名(Ansible 实现)
核心方案:利用ansible_mounts直接提取
Ansible自带的ansible_mounts事实变量存储了全系统挂载点的详细信息,直接过滤根目录/的条目即可拿到目标设备名:
- name: 提取根目录挂载设备名 set_fact: root_device: "{{ ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='device') | first }}" - name: 验证设备名 debug: msg: "根目录挂载设备:{{ root_device }}"
适配LVM场景的扩展方案
如果根目录基于LVM逻辑卷挂载,需要先关联到对应物理卷:
- name: 获取根目录对应的LVM逻辑卷 set_fact: root_lv: "{{ ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='device') | first }}" - name: 提取逻辑卷关联的物理设备 set_fact: root_pv: "{{ ansible_lvm.lvs[root_lv.split('/')[-1]].pv | first }}"
提取设备前缀(如sda/sdb)
如果只需要去掉分区号的设备前缀(比如从/dev/sda2得到sda),用正则处理:
- name: 提取根目录设备前缀 set_fact: root_device_prefix: "{{ root_device | regex_replace('^/dev/(\\w+).*$', '\\1') }}" - name: 验证设备前缀 debug: msg: "根目录设备前缀:{{ root_device_prefix }}"
关键说明
ansible_mounts是Ansible自动收集的系统事实,无需额外任务主动获取selectattr过滤根目录挂载点,map(attribute='device')提取设备字段,first取唯一匹配结果(根目录通常仅一个)- 正则表达式
^/dev/(\w+).*$精准匹配/dev/后的设备主体部分,自动剔除分区号
内容的提问来源于stack exchange,提问作者Robert Petersson
相关产品推荐
相关产品推荐

