在 SaltStack 中管理块设备的正确方法

Correct way to manage block devices in SaltStack

我希望能够使用 SaltStack 提供块设备。在这种特定情况下,Ubuntu 20.04。关于这个主题的文档似乎不多。

目标是使用单个 EXT4 文件系统将新的块设备分区并格式化为 GPT,然后挂载它。如果块设备已经有一个文件系统,它将被挂载。应向 /etc/fstab 添加一个条目,以便使用其分区标签在启动时自动安装设备。

我能够将状态文件放在一起,似乎已经完成了工作,volume.sls:

disk_label_mysql:
  module.run:
    - name: partition.mklabel
    - device: /dev/nvme2n1
    - label_type: gpt
    - unless: "parted /dev/nvme2n1 print | grep -i '^Partition Table: gpt'"

disk_partition_mysql:
  module.run:
    - name: parted_partition.mkpart
    - device: /dev/nvme2n1
    - fs_type: ext4
    - part_type: primary
    - start: 0%
    - end: 100%
    - unless: parted /dev/nvme2n1 print 1
    - require:
      - module: disk_label_mysql

disk_name_mysql:
  module.run:
    - name: partition.name
    - device: /dev/nvme2n1
    - partition: 1
    - m_name: mysql
    - unless: parted /dev/nvme2n1 print | grep mysql
    - require:
      - module: disk_partition_mysql

disk_format_mysql:
  module.run:
    - name: extfs.mkfs
    - device: /dev/nvme2n1p1
    - fs_type: ext4
    - label: mysql
    - unless: blkid --label mysql
    - require:
      - module: disk_name_mysql

disk_mount_mysql:
  file.directory:
    - name: /var/db/mysql
    - user: root
    - group: root
    - file_mode: 644
    - dir_mode: 777
    - makedirs: True
  mount.fstab_present:
    - name: /dev/nvme2n1p1
    - fs_file: /var/db/mysql
    - fs_vfstype: ext4
    - mount: True
    - fs_mntops:
      - defaults
    - mount_by: label
    - require:
      - module: disk_format_mysql

应用状态后,我确实看到设备被分区并且文件系统被格式化。

parted /dev/nvme2n1 print
Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme2n1: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name    Flags
 1      1049kB  53.7GB  53.7GB  ext4         mysql

它也被添加到 /etc/fstab 并安装。

# cat /etc/fstab
LABEL=cloudimg-rootfs   /    ext4   defaults,discard    0 1
LABEL=mysql     /var/db/mysql   ext4    defaults    0 0

# df -h /var/db/mysql
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme2n1p1   49G   53M   47G   1% /var/db/mysql

我想知道是否有“更正确的方法”来做到这一点。当前的方法看起来非常复杂。根据我的经验,这通常意味着我做错了。

有一个管理块设备的 Salt 状态,它被称为 blockdev

如果不需要在磁盘上显式创建和管理分区,使用此状态可以消除对 labelpartitionname 等磁盘的需要.

下面的示例将使用 ext4 文件系统格式化整个磁盘 /dev/sdb 并挂载它。如果你有一个分区,你可以指定它而不是磁盘。

disk_create:
  blockdev.formatted:
    - name: /dev/sdb
    - fs_type: ext4

disk_mount:
  file.directory:
    - name: /mnt/newdisk

  mount.mounted:
    - name: /mnt/newdisk
    - device: /dev/sdb
    - fstype: ext4