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

如何拆分Ansible stdout_lines输出,提取UUID与TYPE配置/etc/fstab

解决方案:提取UUID/TYPE并生成/etc/fstab

步骤1:修复原Playbook语法问题

原Playbook中第二个任务存在缩进错误,先修正基础语法:

---
- name: Get detail for fstab 
  shell: blkid | grep -v VolGrp00 | grep lv_
  register: blkids

- name: BLK UUID
  debug:
    msg: "{{ blkids.stdout_lines | select('search', item.vol_group) | list }}"
  loop: "{{ mount_points }}"

步骤2:解析blkid输出为结构化数据

通过正则表达式从blkids.stdout_lines中提取每个逻辑卷的vol_group、UUID和TYPE,转换为结构化列表便于后续处理:

- name: Parse blkid output into structured entries
  set_fact:
    blkid_structured: "{{ blkid_structured | default([]) + [
      {
        'vol_group': item.split(':')[0].strip(),
        'uuid': item | regex_search('UUID=\"([^\"]+)\"', '\\1') | first,
        'fs_type': item | regex_search('TYPE=\"([^\"]+)\"', '\\1') | first
      }
    ] }}"
  loop: "{{ blkids.stdout_lines }}"
  • 正则UUID=\"([^\"]+)\"匹配双引号内的UUID值,\\1提取捕获组的核心内容
  • split(':')[0]截取冒号前的逻辑卷路径,作为关联mount_points的标识

步骤3:关联挂载点与存储信息

将mount_points变量与解析后的blkid_structured数据关联,生成包含挂载点、UUID、文件系统类型的完整条目:

- name: Combine mount points with blkid data
  set_fact:
    fstab_ready_entries: "{{ fstab_ready_entries | default([]) + [
      {
        'mount_point': item.mount_point,
        'uuid': blkid_structured | selectattr('vol_group', 'equalto', item.vol_group) | map(attribute='uuid') | first,
        'fs_type': blkid_structured | selectattr('vol_group', 'equalto', item.vol_group) | map(attribute='fs_type') | first
      }
    ] }}"
  loop: "{{ mount_points }}"

步骤4:生成并写入/etc/fstab

根据关联后的条目生成符合fstab格式的内容,写入目标文件(建议开启备份避免误操作):

- name: Generate fstab content string
  set_fact:
    fstab_content: "{{ fstab_content | default('') + 'UUID=' + item.uuid + ' ' + item.mount_point + ' ' + item.fs_type + ' defaults 0 0\n' }}"
  loop: "{{ fstab_ready_entries }}"

- name: Write to /etc/fstab
  copy:
    content: "{{ fstab_content }}"
    dest: /etc/fstab
    backup: yes  # 自动备份原文件为/etc/fstab.~1~格式
    mode: '0644'

可选优化:使用官方blkid模块替代shell命令

避免依赖shell命令的兼容性问题,可使用Ansible官方blkid模块直接获取结构化存储信息,可靠性更高:

- name: Get blkid info via ansible module
  ansible.builtin.blkid:
  register: blkid_info

- name: Filter required volumes
  set_fact:
    filtered_blkid: "{{ blkid_info.devices | dict2items | selectattr('key', 'search', 'lv_') | rejectattr('key', 'search', 'VolGrp00') | list }}"

后续关联挂载点的逻辑与步骤3一致,只需调整属性获取方式(如item.value.uuid)。


内容的提问来源于stack exchange,提问作者CiCa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:25:22