Рейтинг:0

Подключите виртуальные жесткие диски Azure к файловой системе во время создания виртуальной машины Azure Linux с помощью Terraform.

флаг cf

Я использую Terraform для автоматизации создания виртуальных машин в Microsoft Azure. Сценарий Terraform должен принять конфигурацию диска данных, как показано ниже (см. data_disk_size_gb), создайте виртуальный жесткий диск и впоследствии смонтируйте его по указанному пути файловой системы.

модуль "jumphost" {
    количество = 1
    источник = "../модули/сервисы/jumphost"
    префикс = "${module.global-vars.project}-${var.environment}"
    rg = azurerm_resource_group.rg
    vm_size = "Стандартный_D2s_v4"
    подсеть = azurerm_subnet.веб-подсеть
    private_ip_address = "10.0.1.250"
    data_disk_size_gb = [ 
        ["/данные", 100],
        ["/данные2", 200]
    ]
    admin_username = "зайдваки"
    admin_public_key_path = "../id_rsa.pub"
    nsg_allow_tcp_ports = [22]
    public_ip_address = правда
}

Создание виртуальных жестких дисков и подключение к виртуальной машине выполняются, как показано ниже, что, я считаю, работает хорошо и не является причиной проблемы.

ресурс "azurerm_managed_disk" "диск данных" {
    количество = длина (var.data_disk_size_gb)
    name = "${var.prefix}-${var.service_name}-data-disk-${count.index}"
    местоположение = var.rg.location
    имя_группы_ресурсов = var.rg.name
    storage_account_type = "Стандартный_LRS"
    create_option = "Пусто"
    disk_size_gb = var.data_disk_size_gb[count.index][1]
}

ресурс "azurerm_virtual_machine_data_disk_attachment" "внешний" {
    count = длина (azurerm_managed_disk.data-disk)
    управляемый_диск_ид = "${azurerm_managed_disk.data-disk[count.index].id}"  
    виртуальная_машина_ид = azurerm_linux_virtual_machine.vm.id  
    лун = "${count.index + 10}"  
    кэширование = "Чтение-Запись"  
}

Чтобы использовать предоставленные диски данных, предусмотрены конфигурации cloud-init для обработки разделов, создания и монтирования файловой системы. Информация для этого предоставляется конфигурацией Terraform через данные template_cloudinit_config, который будет передан виртуальной машине custom_data атрибут

данные "template_cloudinit_config" "config" {
  gzip = правда
  base64_encode = истина
  часть {
      имя_файла = "init-cloud-config"
      content_type = "текст/облачная конфигурация"
      содержимое = файл("../modules/services/${var.service_name}/init.yaml")
  }
  часть {
      имя_файла = "init-shellscript"
      content_type = "текст/x-shellscript"
      content = templatefile("../modules/services/${var.service_name}/init.sh",
        { 
          hostname = "${var.prefix}-${var.service_name}"
          data_disk_size_gb = var.data_disk_size_gb
        }
      )
  }
}

Сценарий оболочки cloud-init init.sh который принимает параметр, как показано ниже

#!/бин/баш

hostnamectl set-hostname ${hostname}

%{ для индекса, диск в data_disk_size_gb ~}
parted /dev/sd${ split("","bcdef")[index] } --script mklabel gpt mkpart xfspart xfs 0% 100%
mkfs.xfs /dev/sd${ split("","bcdef")[index] }1
partprobe /dev/sd${ split("","bcdef")[index] }1
mkdir -p ${диск[0]}
mount /dev/sd${ split("","bcdef")[index] }1 ${disk[0] }
echo UUID=\"`(blkid /dev/sd${ split("","bcdef")[index] }1 -s UUID -o значение)`\" ${ disk[0] } xfs по умолчанию, nofail 1 2 >> /etc/fstab
%{конец~}

По завершении применить терраформ, /данные и /данные2 не видны в дф вывод. Я ожидаю увидеть записи для /dev/sdb1 и /dev/sdc1 с точками крепления /данные и /данные2 соответственно.

[zaidwaqi@starter-stage-jumphost ~]$ ls /
bin boot dev и т. д. домашняя библиотека lib64 media mnt opt ​​proc root run sbin srv sys tmp usr var
[zaidwaqi@starter-stage-jumphost ~]$ df -h
Используемый размер файловой системы Доступно Использование % Установлено на
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 8.6M 3.9G 1%/запуск
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 30G 1.8G 28G 7%/
/dev/sda1 496M 73M 424M 15% /загрузка
/dev/sda15 495M 6,9M 488M 2% /boot/efi
tmpfs 798M 0 798M 0% /выполнить/пользователь/1000

Диагностическая информация

/var/lib/cloud/instance/scripts/

#!/бин/баш

hostnamectl set-hostname starter-stage-jumphost

parted /dev/sdb --script mklabel gpt mkpart xfspart xfs 0% 100%
mkfs.xfs /dev/sdb1
часть зонда /dev/sdb1
mkdir-p/данные
смонтировать /dev/sdb1 /данные
echo UUID=\"`(blkid /dev/sdb1 -s UUID -o value)`\" /data xfs по умолчанию, nofail 1 2 >> /etc/fstab 
parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100%
mkfs.xfs /dev/sdc1
часть зонда /dev/sdc1
mkdir-p/данные2
смонтировать /dev/sdc1 /data2
echo UUID=\"`(blkid /dev/sdc1 -s UUID -o value)`\" /data2 xfs по умолчанию, nofail 1 2 >> /etc/fstab
[zaidwaqi@starter-stage-jumphost скрипты]$ 

/var/log/cloud-init.log

Частичное содержимое журнала. Надеюсь, я покажу соответствующую часть ниже.

2021-07-03 05:42:43,635 - cc_disk_setup.py[DEBUG]: создание новой таблицы разделов/диска
2021-07-03 05:42:43,635 - util.py[DEBUG]: выполнение команды ['udevadm', 'settle'] с разрешенными кодами возврата [0] (shell=False, capture=True)
2021-07-03 05:42:43,651 - util.py[DEBUG]: создание раздела на /dev/disk/cloud/azure_resource заняло 0,016 секунды
2021-07-03 05:42:43,651 - util.py [ПРЕДУПРЕЖДЕНИЕ]: сбой операции разделения
Устройство /dev/disk/cloud/azure_resource не существует и не было создано с установкой udevadm.
2021-07-03 05:42:43,651 - util.py[DEBUG]: сбой операции разделения
Устройство /dev/disk/cloud/azure_resource не существует и не было создано с установкой udevadm.
Traceback (последний последний вызов):
  Файл "/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py", строка 140, в дескрипторе
    func=mkpart, args=(диск, определение))
  Файл "/usr/lib/python3.6/site-packages/cloudinit/util.py", строка 2539, в log_time
    ret = func(*args, **kwargs)
  Файл "/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py", строка 769, в mkpart
    assert_and_settle_device(устройство)
  Файл "/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py", строка 746, в assert_and_settle_device
    "с udevadm поселиться". % устройство)
Ошибка выполнения: устройство /dev/disk/cloud/azure_resource не существует и не было создано с установкой udevadm.
03.07.2021, 05:42:43,672 — cc_disk_setup.py[DEBUG]: настройка файловых систем: [{'filesystem': 'ext4', 'device': 'ephemeral0.1'}]
2021-07-03 05:42:43,672 - cc_disk_setup.py[DEBUG]: ephemeral0.1 сопоставлен с disk=/dev/disk/cloud/azure_resource part=1
03.07.2021, 05:42:43,672 — cc_disk_setup.py[DEBUG]: создание новой файловой системы.
2021-07-03 05:42:43,672 - util.py[DEBUG]: выполнение команды ['udevadm', 'settle'] с разрешенными кодами возврата [0] (shell=False, capture=True)
2021-07-03 05:42:43,684 - util.py[DEBUG]: создание fs для /dev/disk/cloud/azure_resource заняло 0,012 секунды
2021-07-03 05:42:43,684 - util.py [ПРЕДУПРЕЖДЕНИЕ]: сбой во время работы файловой системы
Устройство /dev/disk/cloud/azure_resource не существует и не было создано с установкой udevadm.
2021-07-03 05:42:43,684 - util.py[DEBUG]: сбой при работе с файловой системой
Устройство /dev/disk/cloud/azure_resource не существует и не было создано с установкой udevadm.
Traceback (последний последний вызов):
  Файл "/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py", строка 158, в дескрипторе
    func=mkfs, args=(определение,))
  Файл "/usr/lib/python3.6/site-packages/cloudinit/util.py", строка 2539, в log_time
    ret = func(*args, **kwargs)
  Файл "/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py", строка 871, в mkfs
    assert_and_settle_device(устройство)
  Файл "/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py", строка 746, в assert_and_settle_device
    "с udevadm поселиться". % устройство)
Ошибка выполнения: устройство /dev/disk/cloud/azure_resource не существует и не было создано с установкой udevadm.
03.07.2021, 05:42:43,684 - handlers.py[DEBUG]: завершение: init-network/config-disk_setup: УСПЕХ: config-disk_setup успешно выполнен
03.07.2021, 05:42:43,685 - stage.py[DEBUG]: запуск монтирования модуля (<модуль 'cloudinit.config.cc_mounts' из '/usr/lib/python3.6/site-packages/cloudinit/config/ cc_mounts.py'>) с периодичностью один раз на экземпляр
2021-07-03 05:42:43,685 - handlers.py[DEBUG]: start: init-network/config-mounts: запуск config-mounts с периодичностью один раз для каждого экземпляра
2021-07-03 05:42:43,685 - util.py[DEBUG]: запись в /var/lib/cloud/instances/b7e003ce-7ad3-4840-a4f7-06faefed9cb0/sem/config_mounts - wb: [644] 24 байта

/var/log/cloud-init-output.log

Частичное содержимое журнала. Надеюсь, я покажу соответствующую часть ниже.

Полный!
Cloud-init v. 19.4 с запуском «modules:config» в субботу, 03 июля 2021 г., 05:42:46 +0000. До 2268,33 секунды.
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=6553472 BLKS
         = sectsz=4096 attr=2, projid32bit=1
         = crc=1 finobt=1, разреженный=1, rmapbt=0
         = рефссылка=1
данные = bsize = 4096 блоков = 26213888, imaxpct = 25
         = солнце = 0 ширина = 0 блоков
наименование = версия 2 bsize = 4096 ascii-ci = 0, ftype = 1
log = внутренний журнал bsize = 4096 блоков = 12799, версия = 2
         = sectsz=4096 sunit=1 BLKS, lazy-count=1
в реальном времени = нет extsz = 4096 блоков = 0, rtextents = 0
meta-data=/dev/sdc1 isize=512 agcount=4, agsize=13107072 BLKS
         = sectsz=4096 attr=2, projid32bit=1
         = crc=1 finobt=1, разреженный=1, rmapbt=0
         = рефссылка=1
данные = bsize = 4096 блоков = 52428288, imaxpct = 25
         = солнце = 0 ширина = 0 блоков
наименование = версия 2 bsize = 4096 ascii-ci = 0, ftype = 1
log = внутренний журнал bsize = 4096 блоков = 25599, версия = 2
         = sectsz=4096 sunit=1 BLKS, lazy-count=1
в реальном времени = нет extsz = 4096 блоков = 0, rtextents = 0
Cloud-init v. 19.4 запускает «modules:final» в субботу, 03 июля 2021 г., 05:45:28 +0000. До 2430,85 секунды.
Cloud-init v. 19.4 завершена в субботу, 03 июля 2021 г., 05:45:34 +0000. Источник данных DataSourceAzure [seed=/dev/sr0]. До 2436,88 секунд
флаг cf
Мое последующее чтение предполагает, что это связано с тем, что диск данных не может быть подключен к azure_linux_virtual_machine во время создания. https://github.com/terraform-providers/terraform-provider-azurerm/issues/6117

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.