Folosesc Terraform pentru a automatiza crearea de VM pe Microsoft Azure. Scriptul Terraform va accepta configurația discului de date ca mai jos (consultați data_disk_size_gb), creați hard disk-ul virtual și apoi montați-l în calea de sistem de fișiere dată.
modul „jumphost” {
    număr = 1
    sursa = "../module/services/jumphost"
    prefix = "${module.global-vars.project}-${var.environment}"
    rg = azurerm_resource_group.rg
    vm_size = „Standard_D2s_v4”
    subnet = azurerm_subnet.web-subnet
    private_ip_address = "10.0.1.250"
    data_disk_size_gb = [ 
        ["/date", 100],
        ["/data2" , 200]
    ]
    admin_username = "zaidwaqi"
    admin_public_key_path = "../id_rsa.pub"
    nsg_allow_tcp_ports = [22]
    public_ip_address = adevărat
}
Crearea hard disk-urilor virtuale și atașarea la VM se fac ca mai jos, ceea ce cred că funcționează bine și nu este cauza problemei.
resursa „azurerm_managed_disk” „data-disk” {
    număr = lungime (var.data_disk_size_gb)
    nume = "${var.prefix}-${var.service_name}-data-disk-${count.index}"
    locație = var.rg.location
    nume_grup_resurse = var.rg.name
    storage_account_type = „Standard_LRS”
    create_option = "Gol"
    disk_size_gb = var.data_disk_size_gb[count.index][1]
}
resursă „azurerm_virtual_machine_data_disk_attachment” „externă” {
    număr = lungime(azurerm_managed_disk.data-disk)
    managed_disk_id = „${azurerm_managed_disk.data-disk[count.index].id}”  
    virtual_machine_id = azurerm_linux_virtual_machine.vm.id  
    lun = "${count.index + 10}"  
    cache = „Citește scriere”  
}
Pentru a utiliza discurile de date furnizate, configurațiile cloud-init sunt furnizate pentru a gestiona partiționarea, crearea și montarea sistemului de fișiere. Informațiile pentru aceasta sunt furnizate de Terraform config prin data template_cloudinit_config, care va fi transmis VM date_personalizate atribut
date „template_cloudinit_config” „config” {
  gzip = adevărat
  base64_encode = adevărat
  parte {
      nume fișier = "init-cloud-config"
      content_type = "text/cloud-config"
      continut = fisier("../modules/services/${var.service_name}/init.yaml")
  }
  parte {
      filename = "init-shellscript"
      content_type = "text/x-shellscript"
      continut = templatefile("../modules/services/${var.service_name}/init.sh",
        { 
          hostname = "${var.prefix}-${var.service_name}"
          data_disk_size_gb = var.data_disk_size_gb
        }
      )
  }
}
Scriptul shell-init cloud init.sh care acceptă parametrul este ca mai jos
#!/bin/bash
hostnamectl set-hostname ${hostname}
%{ pentru index, disc în 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 ${ disc[0] }
montați /dev/sd${ split("","bcdef")[index] }1 ${ disc[0] }
echo UUID=\"`(blkid /dev/sd${ split("","bcdef")[index] }1 -s UUID -o valoare)`\" ${ disk[0] } xfs defaults,nofail 1 2 >> /etc/fstab
%{ endfor ~}
La finalizarea se aplică terraform, /date și /data2 nu sunt vizibile în df ieșire. Mă aștept să văd intrări pentru /dev/sdb1 și /dev/sdc1 cu puncte de montare ale /date și /data2 respectiv.
[zaidwaqi@starter-stage-jumphost ~]$ ls /
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[zaidwaqi@starter-stage-jumphost ~]$ df -h
Filesystem Size Used Avail Use% Montat pe
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% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 30G 1.8G 28G 7% /
/dev/sda1 496M 73M 424M 15% /boot
/dev/sda15 495M 6,9M 488M 2% /boot/efi
tmpfs 798M 0 798M 0% /run/user/1000
Informații de diagnostic
/var/lib/cloud/instance/scripts/
#!/bin/bash
hostnamectl set-hostname starter-stage-jumphost
parted /dev/sdb --script mklabel gpt mkpart xfspart xfs 0% 100%
mkfs.xfs /dev/sdb1
partprobe /dev/sdb1
mkdir -p /date
montați /dev/sdb1 /data
echo UUID=\"`(blkid /dev/sdb1 -s UUID -o valoare)`\" /data xfs implicite, nofail 1 2 >> /etc/fstab 
parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100%
mkfs.xfs /dev/sdc1
partprobe /dev/sdc1
mkdir -p /data2
montați /dev/sdc1 /data2
echo UUID=\"`(blkid /dev/sdc1 -s UUID -o valoare)`\" /data2 xfs implicite, nofail 1 2 >> /etc/fstab
[scripturi zaidwaqi@starter-stage-jumphost]$ 
/var/log/cloud-init.log
Conținut parțial al jurnalului. Sper să afișez partea relevantă mai jos.
2021-07-03 05:42:43,635 - cc_disk_setup.py[DEBUG]: se creează un nou tabel/disc de partiții
2021-07-03 05:42:43,635 - util.py[DEBUG]: Rularea comenzii ['udevadm', 'settle'] cu coduri de returnare permise [0] (shell=False, capture=True)
2021-07-03 05:42:43,651 - util.py[DEBUG]: Crearea partiției pe /dev/disk/cloud/azure_resource a durat 0,016 secunde
2021-07-03 05:42:43,651 - util.py[AVERTISMENT]: operațiune de partiționare eșuată
Dispozitivul /dev/disk/cloud/azure_resource nu a existat și nu a fost creat cu o soluție udevadm.
2021-07-03 05:42:43,651 - util.py[DEBUG]: operațiune de partiționare eșuată
Dispozitivul /dev/disk/cloud/azure_resource nu a existat și nu a fost creat cu o soluție udevadm.
Traceback (cel mai recent apel ultimul):
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py”, linia 140, în handle
    func=mkpart, args=(disc, definiție))
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/util.py”, linia 2539, în log_time
    ret = func(*args, **kwargs)
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py”, linia 769, în mkpart
    assert_and_settle_device(dispozitiv)
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py”, linia 746, în assert_and_settle_device
    „cu un udevadm așez”. % dispozitiv)
RuntimeError: Dispozitivul /dev/disk/cloud/azure_resource nu a existat și nu a fost creat cu o soluție udevadm.
2021-07-03 05:42:43,672 - cc_disk_setup.py[DEBUG]: configurarea sistemelor de fișiere: [{'filesystem': 'ext4', 'device': 'ephemeral0.1'}]
2021-07-03 05:42:43,672 - cc_disk_setup.py[DEBUG]: ephemeral0.1 este mapat pe disc=/dev/disk/cloud/azure_resource part=1
2021-07-03 05:42:43,672 - cc_disk_setup.py[DEBUG]: se creează un nou sistem de fișiere.
2021-07-03 05:42:43,672 - util.py[DEBUG]: Rularea comenzii ['udevadm', 'settle'] cu coduri de returnare permise [0] (shell=False, capture=True)
2021-07-03 05:42:43,684 - util.py[DEBUG]: Crearea fs pentru /dev/disk/cloud/azure_resource a durat 0,012 secunde
2021-07-03 05:42:43,684 - util.py[AVERTISMENT]: Eșuat în timpul funcționării sistemului de fișiere
Dispozitivul /dev/disk/cloud/azure_resource nu a existat și nu a fost creat cu o soluție udevadm.
2021-07-03 05:42:43,684 - util.py[DEBUG]: a eșuat în timpul funcționării sistemului de fișiere
Dispozitivul /dev/disk/cloud/azure_resource nu a existat și nu a fost creat cu o soluție udevadm.
Traceback (cel mai recent apel ultimul):
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py”, linia 158, în handle
    func=mkfs, args=(definiție,))
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/util.py”, linia 2539, în log_time
    ret = func(*args, **kwargs)
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py”, linia 871, în mkfs
    assert_and_settle_device(dispozitiv)
  Fișierul „/usr/lib/python3.6/site-packages/cloudinit/config/cc_disk_setup.py”, linia 746, în assert_and_settle_device
    „cu un udevadm așez”. % dispozitiv)
RuntimeError: Dispozitivul /dev/disk/cloud/azure_resource nu a existat și nu a fost creat cu o soluție udevadm.
2021-07-03 05:42:43,684 - handlers.py[DEBUG]: finish: init-network/config-disk_setup: SUCCES: config-disk_setup a rulat cu succes
2021-07-03 05:42:43,685 - stages.py[DEBUG]: Rulează montarea modulului (<modulul „cloudinit.config.cc_mounts” din „/usr/lib/python3.6/site-packages/cloudinit/config/ cc_mounts.py'>) cu frecvență o dată pe o instanță
2021-07-03 05:42:43,685 - handlers.py[DEBUG]: start: init-network/config-mounts: rulează config-mounts cu frecvența o dată pe instanță
2021-07-03 05:42:43,685 - util.py[DEBUG]: Se scrie în /var/lib/cloud/instances/b7e003ce-7ad3-4840-a4f7-06faefed9cb0/sem/config_mounts - wb: [24 by 644]
/var/log/cloud-init-output.log
Conținut parțial al jurnalului. Sper să afișez partea relevantă mai jos.
Complet!
Cloud-init v. 19.4 rulează „modules:config” la sâmbătă, 03 iulie 2021 05:42:46 +0000. Până în 2268,33 secunde.
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=6553472 blks
         = sectsz=4096 attr=2, projid32bit=1
         = crc=1 finobt=1, rar=1, rmapbt=0
         = reflink=1
date = bsize=4096 blocuri=26213888, imaxpct=25
         = sunit=0 swidth=0 blks
naming =versiunea 2 bsize=4096 ascii-ci=0, ftype=1
jurnal = jurnal intern bsize = 4096 blocuri = 12799, versiunea = 2
         = sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
meta-data=/dev/sdc1 isize=512 agcount=4, agsize=13107072 blks
         = sectsz=4096 attr=2, projid32bit=1
         = crc=1 finobt=1, rar=1, rmapbt=0
         = reflink=1
date = bsize=4096 blocuri=52428288, imaxpct=25
         = sunit=0 swidth=0 blks
naming =versiunea 2 bsize=4096 ascii-ci=0, ftype=1
jurnal = jurnal intern bsize = 4096 blocuri = 25599, versiunea = 2
         = sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Cloud-init v. 19.4 rulează „modules:final” la sâmbătă, 03 iulie 2021 05:45:28 +0000. Până la 2430,85 secunde.
Cloud-init v. 19.4 finalizat la sâmbătă, 03 iulie 2021 05:45:34 +0000. Sursa de date DataSourceAzure [seed=/dev/sr0]. Până în 2436,88 secunde