如何拆分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
相关产品推荐
相关产品推荐

