从映像创建 VM 并添加到现有可用性集中

Creating VM's from image and adding to an existing Availability Set

如何将我在门户中创建或从 vmdepot 导入的现有 VM 添加到现有可用性集中?从门户网站上看好像不行,在Powershell中行得通吗?它是否适用于 Resource Manager 部署模型?

目前,对于 ARM 部署,尚不支持设置可用性集。可用性集只能在创建期间添加。因此,对于您的情况,您需要删除当前实例,并使用旧的 OSDisk、Vnet 和一些其他设置创建新部署。

这可以通过使用 ARM 模板来实现。以下示例演示如何部署具有现有 VHD 和 Vnet 的 VM。它还会创建一个新的可用性集,并将 VM 添加到可用性集中。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "metadata": {
        "description": "Please enter the location where you want to deploy this VM"
      }
    },
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "Name of the VM"
      }
    },
    "osType": {
      "type": "string",
      "allowedValues": [
        "Windows",
        "Linux"
      ],
      "metadata": {
        "description": "Type of OS on the existing vhd"
      }
    },
    "osDiskVhdUri": {
      "type": "string",
      "metadata": {
        "description": "Uri of the existing VHD in ARM standard or premium storage"
      }
    },
    "vmSize": {
      "type": "string",
      "metadata": {
        "description": "Size of the VM"
      }
    },
    "existingVirtualNetworkName": {
      "type": "string",
      "metadata": {
        "description": "Name of the existing VNET"
      }
    },
    "existingVirtualNetworkResourceGroup": {
      "type": "string",
      "metadata": {
        "description": "Name of the existing VNET resource group"
      }
    },
    "subnetName": {
      "type": "string",
      "metadata": {
        "description": "Name of the subnet in the virtual network you want to use"
      }
    },
    "dnsNameForPublicIP": {
      "type": "string",
      "metadata": {
        "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
      }
    },
    "availabilitySetName": {
      "type": "string",
      "metadata": {
        "description": "The name of your Availability Set."
      }
    }
  },
  "variables": {
    "api-version": "2015-06-15",
    "publicIPAddressType": "Dynamic",
    "vnetID": "[resourceId(parameters('existingVirtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks', parameters('existingVirtualNetworkName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/', parameters('subnetName'))]",
    "nicName": "[parameters('vmName')]",
    "publicIPAddressName": "[parameters('vmName')]"
  },
  "resources": [
    {
      "apiVersion": "[variables('api-version')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "location": "[parameters('location')]",
      "tags": {
        "displayName": "PublicIPAddress"
      },
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
        "dnsSettings": {
          "domainNameLabel": "[parameters('dnsNameForPublicIP')]"
        }
      }
    },
    {
      "apiVersion": "[variables('api-version')]",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"
      ],
      "tags": {
        "displayName": "NetworkInterface"
      },
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
              },
              "subnet": {
                "id": "[variables('subnetRef')]"
              }
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Compute/availabilitySets",
      "name": "[parameters('availabilitySetName')]",
      "apiVersion": "2015-06-15",
      "location": "[parameters('location')]",
      "properties": {
        "platformFaultDomainCount": "3",
        "platformUpdateDomainCount": "20"
      }
    },
    {
      "apiVersion": "[variables('api-version')]",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[parameters('vmName')]",
      "location": "[parameters('location')]",
      "tags": {
        "displayName": "VirtualMachine"
      },
      "dependsOn": [
        "[concat('Microsoft.Compute/availabilitySets/', parameters('availabilitySetName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('vmSize')]"
        },
        "AvailabilitySet" : {
          "id": "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySetName'))]"
        },
        "storageProfile": {
          "osDisk": {
            "name": "[concat(parameters('vmName'))]",
            "osType": "[parameters('osType')]",
            "caching": "ReadWrite",
            "vhd": {
              "uri": "[parameters('osDiskVhdUri')]"
            },
            "createOption": "Attach"
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        }
      }
    }
  ]
}

如果要将 VM 添加到现有可用性集中,可以删除

    {
      "type": "Microsoft.Compute/availabilitySets",
      "name": "[parameters('availabilitySetName')]",
      "apiVersion": "2015-06-15",
      "location": "[parameters('location')]",
      "properties": {
        "platformFaultDomainCount": "3",
        "platformUpdateDomainCount": "20"
      }
    },

        "[concat('Microsoft.Compute/availabilitySets/', parameters('availabilitySetName'))]",

有关编写 ARM 模板的更多详细信息,请参阅 Authoring Azure Resource Manager templates

有关如何部署 ARM 模板的详细信息,请参阅 Deploy a Resource Group with Azure Resource Manager template

并且上面的模板是从this sample template修改自GitHub。





发布此答案后,我一直在考虑使用 REST API 使用可用性集更新虚拟机。我认为它可能有效,所以我试了一下,这是我收到的错误消息:

Invoke-RestMethod : {
  "error": {
    "code": "PropertyChangeNotAllowed",
    "target": "availabilitySet.id",
    "message": "Changing property 'availabilitySet.id' is not allowed."
  }
}
At C:\Users\v-dazen\Documents\setVMRestAPI.ps1:13 char:1
+ Invoke-RestMethod -Method Put -Uri "https://management.azure.com/subs ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

这意味着还不能为现有的 ARM 部署 VM 设置可用性集。