1

I can create a Azure VM with a specific VHD from the template below but how do I also add it to an Availability Set. I can't do this after VM creation so I need to do it here.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "metadata": {
                "description": "Location to create the VM in"
            }
        },
        "osDiskVhdUri": {
            "type": "string",
            "metadata": {
                "description": "Uri of the existing VHD"
            }
        },
        "osType": {
            "type": "string",
            "allowedValues": [
                "Windows",
                "Linux"
            ],
            "metadata": {
                "description": "Type of OS on the existing vhd"
            }
        },
        "vmSize": {
            "type": "string",
            "defaultValue": "Standard_D2",
            "metadata": {
                "description": "Size of the VM"
            }
        },
        "vmName": {
            "type": "string",
            "metadata": {
                "description": "Name of the VM"
            }
        }
    },
    "variables": {
        "api-version": "2015-06-15",
        "addressPrefix": "10.0.0.0/16",
        "subnetName": "Subnet",
        "subnetPrefix": "10.0.0.0/24",
        "publicIPAddressName": "specializedVMPublicIP",
        "publicIPAddressType": "Dynamic",
        "virtualNetworkName": "specializedVMVNET",
        "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
        "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
        "nicName": "specializedVMNic"
    },
    "resources": [
        {
            "apiVersion": "[variables('api-version')]",
            "type": "Microsoft.Network/virtualNetworks",
            "name": "[variables('virtualNetworkName')]",
            "location": "[parameters('location')]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[variables('addressPrefix')]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[variables('subnetName')]",
                        "properties": {
                            "addressPrefix": "[variables('subnetPrefix')]"
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "[variables('api-version')]",
            "type": "Microsoft.Network/networkInterfaces",
            "name": "[variables('nicName')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]",
                "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
                            },
                            "subnet": {
                                "id": "[variables('subnetRef')]"
                            }
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "[variables('api-version')]",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[variables('publicIPAddressName')]",
            "location": "[parameters('location')]",
            "properties": {
                "publicIPAllocationMethod": "[variables('publicIPAddressType')]"
            }
        },
        {
            "apiVersion": "[variables('api-version')]",
            "type": "Microsoft.Compute/virtualMachines",
            "name": "[parameters('vmName')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
            ],
            "properties": {
                "hardwareProfile": {
                    "vmSize": "[parameters('vmSize')]"
                },
                "storageProfile": {
                    "osDisk": {
                        "name": "[concat(parameters('vmName'),'-osDisk')]",
                        "osType": "[parameters('osType')]",
                        "caching": "ReadWrite",
                        "vhd": {
                            "uri": "[parameters('osDiskVhdUri')]"
                        },
                        "createOption": "Attach"
                    }
                },
                "networkProfile": {
                    "networkInterfaces": [
                        {
                            "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]"
                        }
                    ]
                }
            }
        }
    ]
}
juvchan
  • 6,113
  • 2
  • 22
  • 35
Mike Flynn
  • 22,342
  • 54
  • 182
  • 341

2 Answers2

1

The best way to figure things like this out is to poke through the templates until you find what you need!

So according to this template, you create an Availability Set like this

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

and then (according to this) you use it like this

"apiVersion": "[variables('apiVersion')]",
"type": "Microsoft.Compute/virtualMachines",
"name": "[concat('myvm', copyIndex())]",
"location": "[variables('location')]",
"copy": {
  "name": "virtualMachineLoop",
  "count": "[parameters('numberOfInstances')]"
},
"dependsOn": [
  "[concat('Microsoft.Network/networkInterfaces/', 'nic', copyindex())]",
  "[concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]"
],
"properties": {
  "availabilitySet": {
    "id": "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]"
  },
Michael B
  • 11,887
  • 6
  • 38
  • 74
0

You would need to be looking at the Microsoft.Compute/availabilitySets resource provider, here is some sample JSON from one of my templates.

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

You then need to use the availabilitySet property of the virtualMachines resource provider to add the VMs to the availability set. Make sure you use dependsOn to ensure the availability set is created before the VM. As an example if you refering to it by name:

"properties": {
        "hardwareProfile": { "vmSize": "Standard_A0" },
        "networkProfile": ...,
        "availabilitySet": { "id": "availabilitySet1" },
}
Martyn C
  • 1,109
  • 9
  • 18