使用 Ansible 创建 LVM 逻辑卷并挂载
2024-07-18
100
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 官方文档页面以获取更多模块使用指南。
更新于:6个月前
赞一波!1
相关文章
文章评论
评论问答