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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:13:10