基于Ansible实现按容量分配LVM并挂载文件系统
基于Ansible循环优化多磁盘LVM挂载配置
核心思路
通过定义统一的挂载配置列表,复用相同的任务逻辑,避免重复编写四次代码块。以下是优化后的完整实现:
1. 定义挂载配置变量
在Playbook中(或单独的变量文件里),将所有磁盘与挂载点的对应关系整理为结构化列表:
mount_configs: # /abc 对应200GB的/dev/sdb - physical_device: /dev/sdb mountpoint: /abc vg_name: abcvg lv_name: abclv # /cde 对应100GB的/dev/sda - physical_device: /dev/sda mountpoint: /cde vg_name: cdevg lv_name: cdelv # /efg 对应100GB的/dev/sdd - physical_device: /dev/sdd mountpoint: /efg vg_name: efgvg lv_name: efglv # 剩余50GB的/dev/sdc对应挂载点/hij(可自行调整挂载点名称) - physical_device: /dev/sdc mountpoint: /hij vg_name: hijvg lv_name: hijlv
2. 循环执行所有挂载任务
将原有的重复任务块改为循环遍历上述配置列表,实现批量处理:
- name: 批量配置LVM与文件系统挂载 hosts: your_target_hosts # 替换为你的目标主机组 vars: mount_configs: - physical_device: /dev/sdb mountpoint: /abc vg_name: abcvg lv_name: abclv - physical_device: /dev/sda mountpoint: /cde vg_name: cdevg lv_name: cdelv - physical_device: /dev/sdd mountpoint: /efg vg_name: efgvg lv_name: efglv - physical_device: /dev/sdc mountpoint: /hij vg_name: hijvg lv_name: hijlv tasks: - name: 创建LVM物理分区 parted: device: "{{ item.physical_device }}" number: 1 flags: [lvm] state: present loop: "{{ mount_configs }}" loop_control: label: "处理磁盘 {{ item.physical_device }} → {{ item.mountpoint }}" - name: 创建卷组 lvg: vg: "{{ item.vg_name }}" pvs: "{{ item.physical_device }}1" pesize: 16 loop: "{{ mount_configs }}" loop_control: label: "创建卷组 {{ item.vg_name }} 对应 {{ item.mountpoint }}" - name: 创建逻辑卷(占用磁盘全部空间) lvol: vg: "{{ item.vg_name }}" lv: "{{ item.lv_name }}" size: 100%FREE force: yes loop: "{{ mount_configs }}" loop_control: label: "创建逻辑卷 {{ item.lv_name }} 于卷组 {{ item.vg_name }}" - name: 创建挂载点目录 file: path: "{{ item.mountpoint }}" state: directory mode: '0755' loop: "{{ mount_configs }}" loop_control: label: "创建挂载点 {{ item.mountpoint }}" - name: 格式化为XFS文件系统 filesystem: fstype: xfs state: present dev: "/dev/mapper/{{ item.vg_name }}-{{ item.lv_name }}" loop: "{{ mount_configs }}" loop_control: label: "格式化逻辑卷 /dev/mapper/{{ item.vg_name }}-{{ item.lv_name }}" - name: 挂载文件系统并更新fstab mount: path: "{{ item.mountpoint }}" src: "/dev/mapper/{{ item.vg_name }}-{{ item.lv_name }}" fstype: xfs state: mounted loop: "{{ mount_configs }}" loop_control: label: "挂载 {{ item.mountpoint }}"
优化亮点
- 可维护性:所有配置集中在
mount_configs列表,修改或新增挂载点只需调整列表项,无需重复修改任务代码 - 可读性:通过
loop_control.label自定义任务执行时的显示标签,清晰对应每个磁盘与挂载点的处理流程 - 灵活性:逻辑卷使用
100%FREE自动占用对应磁盘的全部空间,适配不同容量的磁盘需求
内容的提问来源于stack exchange,提问作者user312307
相关产品推荐
相关产品推荐

