0

我正在寻找使用适用于 Azure 的节点/Javascript SDK 来启动 VM。到目前为止,我的代码很幸运,它几乎可以按预期工作。但是,我想启动第 2 代/HyperV v2 虚拟机,而不是默认的 v1。这是我的代码片段:

return new Promise((resolve, reject) => {
    let resourceClient = new ComputeManagementClient(credentials, azureSubscriptionID);
    resourceClient.virtualMachines.createOrUpdate(reourceGroup, name, {
      location: location,
      osProfile: { computerName: name, adminUsername: 'admin', adminPassword: adminPassword, customData: Buffer.from(prepScript).toString('base64') },
      hardwareProfile: { vmSize: 'Standard_B2s' },
      HyperVGeneration: 'V2',
      storageProfile: {
        imageReference: { publisher: 'Canonical', offer: 'UbuntuServer', sku: '18.04-LTS', version: 'latest' },
        osDisk: { name: name + '-disk', createOption: 'FromImage' }
      },
      networkProfile: {
        networkInterfaces: [{ id: nic.id, primary: true }]
      }
    }, function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  }

我遇到的问题是:

HyperVGeneration: 'V2'

因为它似乎甚至不适用。我也没有收到任何错误,只是创建了一个 V1 虚拟机。Azure Docs 在这里有点缺乏:https ://docs.microsoft.com/en-us/javascript/api/@azure/arm-compute/hypervgeneration?view=azure-node-latest 我也尝试过其他的HyperVGenerationType / Types等参数具有相同的结果。

4

1 回答 1

1

我想到了!

我在这里解决了错误的假设。不是将 VM 生成/HyperVGeneration 配置为 V2,而是以某种方式使用 gen2 映像 sku 来作为 OS 磁盘的基础,而是自动将 VM 生成配置为 V2。MS 用多个名称调用同一事物的事实也无济于事:VM 生成、HyperV 生成、映像生成。

无论如何,解决方案是实际查找所有可以安装的可用图像并从中选择正确的图像。要获取您所在地区的可用图像:

az vm image list --all --publisher 'Canonical' --sku '18_04' --output table

它返回如下内容:

Offer                                         Publisher    Sku                           Urn                                                                                          Version
--------------------------------------------  -----------  ----------------------------  -------------------------------------------------------------------------------------------  ---------------
0001-com-ubuntu-confidential-vm-experimental  Canonical    18_04                         Canonical:0001-com-ubuntu-confidential-vm-experimental:18_04:18.04.20210309                  18.04.20210309
0001-com-ubuntu-confidential-vm-experimental  Canonical    18_04-gen2                    Canonical:0001-com-ubuntu-confidential-vm-experimental:18_04-gen2:18.04.20210309             18.04.20210309
0001-com-ubuntu-pro-advanced-sla              Canonical    18_04                         Canonical:0001-com-ubuntu-pro-advanced-sla:18_04:18.04.20200318                              18.04.20200318
0001-com-ubuntu-pro-advanced-sla              Canonical    18_04                         Canonical:0001-com-ubuntu-pro-advanced-sla:18_04:18.04.20200605                              18.04.20200605
...

另一件值得注意的事情是,一些 Ubuntu 映像的 sku 为“18.04”,而一些“18_04”则进一步混淆了事情。

最终的解决方案是使用此代码段将它们放在一起:

return new Promise((resolve, reject) => {
    let resourceClient = new ComputeManagementClient(credentials, azureSubscriptionID);
    resourceClient.virtualMachines.createOrUpdate(reourceGroup, name, {
      location: location,
      osProfile: { computerName: name, adminUsername: 'admin', adminPassword: adminPassword, customData: Buffer.from(prepScript).toString('base64') },
      hardwareProfile: { vmSize: 'Standard_B2s' },
      storageProfile: {
        imageReference: { publisher: 'Canonical', offer: 'UbuntuServer', sku: '18_04-lts-gen2', version: 'latest' },
        osDisk: { name: name + '-disk', createOption: 'FromImage' }
      },
      networkProfile: {
        networkInterfaces: [{ id: nic.id, primary: true }]
      }
    }, function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  }

请注意图像 sku 是18_04-lts-gen2而不是18.04-LTS

于 2021-12-31T19:49:07.647 回答