雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

使用 Ansible 创建 LVM 逻辑卷并挂载

2024-07-18 40

LVM 提供物理存储的抽象层,并允许您创建逻辑存储卷。对于逻辑卷,物理磁盘大小没有限制。此外,硬件存储配置对软件隐藏,从而可以轻松调整大小并消除停止应用程序或卸载文件系统的需要。

逻辑卷的一些好处是:

  • 轻松命名设备:可以在用户定义和自定义命名组中管理逻辑存储卷。
  • 磁盘条带化:您可以创建逻辑卷,将数据条带化到两个或多个磁盘上,从而提高吞吐量。
  • 卷镜像:使用逻辑卷,您可以提供一种便捷的方式来配置数据镜像
  • 轻松调整存储池大小:能够扩展逻辑卷或减小逻辑卷大小,而无需重新格式化和重新分区底层磁盘设备
  • 容量扩展的灵活性:您可以通过磁盘聚合和分区到单个逻辑卷来跨多个磁盘扩展文件系统。
  • 以及更多

在本文中,我们将了解如何使用 Ansible playbook 创建逻辑卷,并考虑以下事项:

  • 在现有卷组中创建逻辑卷。
  • 创建PV、VG,然后创建逻辑卷(LV)

LVM结构:

  • 物理卷:已初始化的块设备(物理磁盘或分区)。
  • 卷组:物理卷组合成卷组。它代表可用存储空间的单个存储池。
  • 逻辑卷:在卷组之上创建(类似于在磁盘分区上创建简单分区)

1. 使用现有卷组创建逻辑卷

以下是一个示例 playbook,可以在从现有卷组创建逻辑卷时对其进行修改。

---
- name: Playbook to create LV, Filesystem and Mount it
  hosts: myservers
  remote_user: debian
  become: yes
  become_method: sudo
  vars:
    vg_name: vg0
    lv_name: container_data
    lv_size: 20g
    fs_type: xfs
    mount_path: /data
  tasks:
    - name: Create Logical Volume for data persistence
      community.general.lvol:
        vg: "{{ vg_name }}"
        lv: "{{ lv_name }}"
        size: "{{ lv_size }}"

    - name: Create filesystem on LV 
      community.general.filesystem:
        fstype: "{{ fs_type }}"
        dev:  /dev/mapper/{{ vg_name }}-{{ lv_name }}

    - name: Get LV UUID
      ansible.builtin.command: lsblk /dev/mapper/{{ vg_name }}-{{ lv_name }} -no UUID
      register: lv_uuid

    - name: Mount created filesystem
      ansible.posix.mount:
        path: "{{ mount_path }}"
        src: UUID={{ lv_uuid.stdout }} 
        state: mounted
        fstype: "{{ fs_type }}"

使用的变量:

  • vg_name:服务器中现有卷组的名称
  • lv_name:要创建的逻辑卷的名称。
  • lv_size:正在创建的逻辑卷的大小。 t 代表太字节,g 代表千兆字节,m 代表兆字节。
  • fs_type:LV 分区中使用的文件系统类型
  • mount_path:磁盘挂载的目录。如果不存在,则会创建它。

使用您的服务器创建库存文件。

$ vim hosts
[myservers]
192.168.1.20
192.168.1.21
192.168.1.22

自定义创建逻辑卷后运行 playbook。

$ ansible-playbook -i hosts lvm-partition_data.yml

PLAY [Playbook to create LV, Filesystem and Mount it] ************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************
ok: [192.168.1.20]

TASK [Create Logical Volume for data persistence] ****************************************************************************************************************************************************
changed: [192.168.1.20]

TASK [Create filesystem on LV] ***********************************************************************************************************************************************************************
changed: [192.168.1.20]

TASK [Get LV UUID] ***********************************************************************************************************************************************************************************
changed: [192.168.1.20]

TASK [Mount created filesystem] **********************************************************************************************************************************************************************
changed: [192.168.1.20]

PLAY RECAP *******************************************************************************************************************************************************************************************
192.168.1.20             : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2、创建物理卷、卷组和逻辑卷

在此示例中,我们使用原始磁盘创建 PV,然后创建 VG 和 LV。

本示例中使用的原始磁盘是:

  • /dev/vdb
  • /dev/vdc

检查您的服务器以查看可用的原始磁盘设备。

$ lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0     7:0    0  63.5M  1 loop /snap/core20/2015
loop1     7:1    0 111.9M  1 loop /snap/lxd/24322
loop2     7:2    0  40.8M  1 loop /snap/snapd/20092
sr0      11:0    1     4M  0 rom
vda     252:0    0    30G  0 disk
├─vda1  252:1    0  29.9G  0 part /
├─vda14 252:14   0     4M  0 part
└─vda15 252:15   0   106M  0 part /boot/efi
vdb     252:16   0    20G  0 disk
vdc     252:32   0    20G  0 disk

让我们创建剧本文件。

vim lvm_pv_vg_lv.yml

自定义以下内容以在 ansible playbook 中使用。

---
- name: Playbook to create PV, VG, LV, Filesystem and Mount it
  hosts: myservers
  remote_user: ubuntu
  become: yes
  become_method: sudo
  vars:
    pv_disks: /dev/vdb
    #pv_disks: /dev/vdb,/dev/vdc
    vg_name: vg1
    lv_name: container_data
    lv_size: +100%FREE
    #lv_size: 10g
    fs_type: ext4
    mount_path: /data
  tasks:
    - name: Create a volume group
      community.general.lvg:
        vg: "{{ vg_name }}"
        pvs: "{{ pv_disks }}"

    - name: Create Logical Volume for data persistence
      community.general.lvol:
        vg: "{{ vg_name }}"
        lv: "{{ lv_name }}"
        size: "{{ lv_size }}"

    - name: Create filesystem on LV 
      community.general.filesystem:
        fstype: "{{ fs_type }}"
        resizefs: true
        dev:  /dev/mapper/{{ vg_name }}-{{ lv_name }}

    - name: Get LV UUID
      ansible.builtin.command: lsblk /dev/mapper/{{ vg_name }}-{{ lv_name }} -no UUID
      register: lv_uuid

    - name: Mount created filesystem
      ansible.posix.mount:
        path: "{{ mount_path }}"
        src: UUID={{ lv_uuid.stdout }} 
        state: mounted
        fstype: "{{ fs_type }}"

在哪里 :

  • pv_disks:一个或多个原始磁盘设备路径的列表
  • vg_name:要创建的卷组的名称
  • lv_name:要创建的逻辑卷的名称
  • lv_size:要创建的逻辑卷的大小。 t 代表太字节,g 代表千兆字节,m 代表兆字节。
  • fs_type:设备分区中使用的文件系统类型
  • mount_path:磁盘挂载的目录。如果不存在,则会创建它。

完成后运行 Playbook 创建 PV、VG 和 LV。

$ ansible-playbook -i hosts lvm_pv_vg_lv.yml
PLAY [Playbook to create LV, Filesystem and Mount it] ************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************
ok: [192.168.56.50]

TASK [Create a volume group] *************************************************************************************************************************************************************************
changed: [192.168.56.50] => (item=/dev/vdb)

TASK [Create Logical Volume for data persistence] ****************************************************************************************************************************************************
changed: [192.168.56.50]

TASK [Create filesystem on LV] ***********************************************************************************************************************************************************************
changed: [192.168.56.50]

TASK [Get LV UUID] ***********************************************************************************************************************************************************************************
changed: [192.168.56.50]

TASK [Mount created filesystem] **********************************************************************************************************************************************************************
changed: [192.168.56.50]

PLAY RECAP *******************************************************************************************************************************************************************************************
192.168.56.50              : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

确认PV、VG和LV创建。

$ sudo pvs
  PV         VG  Fmt  Attr PSize   PFree
  /dev/vdb   vg1 lvm2 a--  <20.00g     0

$ sudo vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  vg1   1   1   0 wz--n- <20.00g    0

$ sudo lvs
  LV             VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  container_data vg1 -wi-ao---- <20.00g

$ df -hT /data
Filesystem                     Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg1-container_data ext4   20G   24K   19G   1% /data

$ cat /etc/fstab
LABEL=cloudimg-rootfs	/	 ext4	discard,errors=remount-ro	0 1
LABEL=UEFI	/boot/efi	vfat	umask=0077	0 1
UUID=e7e6a6f6-e85e-46a2-b070-c3ee5fb571f5 /data ext4 defaults 0 0

从命令输出中我们可以确认 playbook 执行成功。这是 LVM 管理的基本 ansible 使用示例。您可以查看 Ansible 官方文档页面以获取更多模块使用指南。


更新于:2个月前
赞一波!

文章评论

全部评论