Правильный способ управления блочными устройствами в SaltStack

#salt-stack

Вопрос:

Я хотел бы иметь возможность блокировать устройства с помощью SaltStack. В данном конкретном случае в Ubuntu 20.04. Похоже, на эту тему не так много документации.

Цель состоит в том, чтобы разделить и отформатировать новое блочное устройство как GPT с помощью одной файловой системы EXT4, а затем смонтировать его. Если на блочном устройстве уже есть файловая система, она будет просто смонтирована. Необходимо добавить запись /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
 

После применения sate я вижу, что устройство разбивается на разделы и форматируется файловая система.

 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
 

Я хотел бы знать, есть ли «более правильный способ» сделать это. Нынешний подход выглядит очень сложным. По моему опыту, это обычно означает, что я делаю это неправильно.

Ответ №1:

Существует состояние соли для управления блочными устройствами, и оно называется blockdev.

Если нет необходимости явно создавать разделы на диске и управлять ими, использование этого состояния может устранить необходимость в label , partition , и т.д. name диск.

В приведенном ниже примере будет отформатирован весь диск /dev/sdb с ext4 файловой системой и смонтирован. Если у вас есть раздел, вы можете указать его вместо диска.

 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
 

Комментарии:

1. Спасибо, я посмотрел на blockdev, но в настоящее время он не поддерживает возможность добавления метки раздела. Я хочу добавить /etc/fstab и ссылаться на него, используя LABEL=xxxxx вместо имени устройства. Или это не очень важно для Ubuntu на AWS?

2. Для вашего случая использования, когда вам нужны конкретные разделы, метки и т. Д. ваш подход работает лучше. Если у вас нет необходимости часто добавлять/редактировать диски экземпляра EC2, использование имен дисков в /etc/fstab должно быть в порядке.

3. Я смог придумать работоспособное решение, используя часть вашего ответа вместе с тем, что у меня было ранее ( unibia.com/unibianet/copypastie/volumesls ). У меня возникла проблема, когда ОС случайным образом переупорядочивала имя устройства независимо от того, что я установил на стороне AWS, таким образом, рассуждая о ярлыках. Мне, вероятно, следует подумать об использовании столбов или зерен, чтобы, возможно, получить имена устройств.