Another week, another Azure tool that I’ve come by and thought I’d share with the masses. Though this one isn’t a major revelation or a something that I’ve added to my Chrome work profile bookmarks bar like I did with the Azure Resource Explorer (as yet, though, I may well add this in the very near future), I certainly have it bookmarked in my Azure folder in Chrome bookmarks.
When working with Azure Resource Manager templates, you’re dealing with long JSON files. These files can get to be pretty big in size and span hundreds of lines. Here’s an example of one:
(word or warning- scroll to the bottom as there is more content after this ~250+ line ARM template sample)
{ "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json", "contentVersion": "1.0.0.0", "parameters": { "storageAccountName": { "type": "string", "metadata": { "description": "Name of storage account" } }, "adminUsername": { "type": "string", "metadata": { "description": "Admin username" } }, "adminPassword": { "type": "securestring", "metadata": { "description": "Admin password" } }, "dnsNameforLBIP": { "type": "string", "metadata": { "description": "DNS for Load Balancer IP" } }, "vmSize": { "type": "string", "defaultValue": "Standard_D2", "metadata": { "description": "Size of the VM" } } }, "variables": { "storageAccountType": "Standard_LRS", "addressPrefix": "10.0.0.0/16", "subnetName": "Subnet-1", "subnetPrefix": "10.0.0.0/24", "publicIPAddressType": "Dynamic", "nic1NamePrefix": "nic1", "nic2NamePrefix": "nic2", "imagePublisher": "MicrosoftWindowsServer", "imageOffer": "WindowsServer", "imageSKU": "2012-R2-Datacenter", "vnetName": "myVNET", "publicIPAddressName": "myPublicIP", "lbName": "myLB", "vmNamePrefix": "myVM", "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('vnetName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", "publicIPAddressID": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]", "lbID": "[resourceId('Microsoft.Network/loadBalancers',variables('lbName'))]", "frontEndIPConfigID": "[concat(variables('lbID'),'/frontendIPConfigurations/LoadBalancerFrontEnd')]", "lbPoolID": "[concat(variables('lbID'),'/backendAddressPools/BackendPool1')]" }, "resources": [ { "type": "Microsoft.Storage/storageAccounts", "name": "[parameters('storageAccountName')]", "apiVersion": "2015-05-01-preview", "location": "[resourceGroup().location]", "properties": { "accountType": "[variables('storageAccountType')]" } }, { "apiVersion": "2015-05-01-preview", "type": "Microsoft.Network/publicIPAddresses", "name": "[variables('publicIPAddressName')]", "location": "[resourceGroup().location]", "properties": { "publicIPAllocationMethod": "[variables('publicIPAddressType')]", "dnsSettings": { "domainNameLabel": "[parameters('dnsNameforLBIP')]" } } }, { "apiVersion": "2015-05-01-preview", "type": "Microsoft.Network/virtualNetworks", "name": "[variables('vnetName')]", "location": "[resourceGroup().location]", "properties": { "addressSpace": { "addressPrefixes": [ "[variables('addressPrefix')]" ] }, "subnets": [ { "name": "[variables('subnetName')]", "properties": { "addressPrefix": "[variables('subnetPrefix')]" } } ] } }, { "apiVersion": "2015-05-01-preview", "type": "Microsoft.Network/networkInterfaces", "name": "[variables('nic1NamePrefix')]", "location": "[resourceGroup().location]", "dependsOn": [ "[concat('Microsoft.Network/virtualNetworks/', variables('vnetName'))]", "[concat('Microsoft.Network/loadBalancers/', variables('lbName'))]" ], "properties": { "ipConfigurations": [ { "name": "ipconfig1", "properties": { "privateIPAllocationMethod": "Dynamic", "subnet": { "id": "[variables('subnetRef')]" }, "loadBalancerBackendAddressPools": [ { "id": "[concat(variables('lbID'), '/backendAddressPools/BackendPool1')]" } ], "loadBalancerInboundNatRules": [ { "id": "[concat(variables('lbID'),'/inboundNatRules/RDP-VM0')]" } ] } } ] } }, { "apiVersion": "2015-05-01-preview", "type": "Microsoft.Network/networkInterfaces", "name": "[variables('nic2NamePrefix')]", "location": "[resourceGroup().location]", "dependsOn": [ "[concat('Microsoft.Network/virtualNetworks/', variables('vnetName'))]" ], "properties": { "ipConfigurations": [ { "name": "ipconfig1", "properties": { "privateIPAllocationMethod": "Dynamic", "subnet": { "id": "[variables('subnetRef')]" } } } ] } }, { "apiVersion": "2015-05-01-preview", "name": "[variables('lbName')]", "type": "Microsoft.Network/loadBalancers", "location": "[resourceGroup().location]", "dependsOn": [ "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]" ], "properties": { "frontendIPConfigurations": [ { "name": "LoadBalancerFrontEnd", "properties": { "publicIPAddress": { "id": "[variables('publicIPAddressID')]" } } } ], "backendAddressPools": [ { "name": "BackendPool1" } ], "inboundNatRules": [ { "name": "RDP-VM0", "properties": { "frontendIPConfiguration": { "id": "[variables('frontEndIPConfigID')]" }, "protocol": "tcp", "frontendPort": 50001, "backendPort": 3389, "enableFloatingIP": false } } ] } }, { "apiVersion": "2015-06-15", "type": "Microsoft.Compute/virtualMachines", "name": "[variables('vmNamePrefix')]", "location": "[resourceGroup().location]", "dependsOn": [ "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]", "[concat('Microsoft.Network/networkInterfaces/', variables('nic1NamePrefix'))]", "[concat('Microsoft.Network/networkInterfaces/', variables('nic2NamePrefix'))]" ], "properties": { "hardwareProfile": { "vmSize": "[parameters('vmSize')]" }, "osProfile": { "computername": "[variables('vmNamePrefix')]", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]" }, "storageProfile": { "imageReference": { "publisher": "[variables('imagePublisher')]", "offer": "[variables('imageOffer')]", "sku": "[variables('imageSKU')]", "version": "latest" }, "osDisk": { "name": "osdisk", "vhd": { "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/vhds/','osdisk', '.vhd')]" }, "caching": "ReadWrite", "createOption": "FromImage" } }, "networkProfile": { "networkInterfaces": [ { "properties": { "primary": true }, "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nic1NamePrefix'))]" }, { "properties": { "primary": false }, "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nic2NamePrefix'))]" } ] }, "diagnosticsProfile": { "bootDiagnostics": { "enabled": "true", "storageUri": "[concat('http://',parameters('StorageAccountName'),'.blob.core.windows.net')]" } } } } ] }
So what is this Azure Resource Visualiser?
For those following at home and are cluey enough to pick up on what the ARM Visualiser is, it’s a means to help visualise the components and relationships of those components in an ARM template. It does this in a very user friendly and easy to use way.
What you can do is as follows:
- Play around with ARMVIZ with a pre-build ARM template
- Import your own ARM template and visualise the characteristics of your components and their relationships
- This helps validate the ARM template and make sure there are no errors or bugs
- You can have quick access to the ARM Quickstart templates library in Github
- Available via Azure/azure-quickstart-templates on Github
- You can view your JSON ARM template online
- You can create a new ARM template from scratch or via copying one of the quick start templates ONLINE in your browser of choice
- You can freely edit that template and go from JSON view to the Visualiser view quickly
- You can then download a copy of your ARM template that is built, tested, visualised and working
- You can provide helpful feedback to the team from Azure working on this service
- Possibly leading to this being rolled up into the Azure Portal at some point in the future
- All of the components are able to be moved around the screen as well
- If you double click on any of the components, for example the Load Balancer, you’ll be taken to the line in the ARM template to view or amend the config
What does ARMVIZ.io look like?
Here’s a sample ARM template visualised
Final words
If you want a quick, fun ARM template editor and your favourite ISE is just behaving like it did ever other day, then spruce up and pimp up your day with the Azure Resource Visualiser. In the coming weeks I’m going to be doing quick a few ARM templates. I can assure you that those will be run through the Azure Resource Visualiser to validate and check for any errors.
Pro-tip: don’t upload an ARM template to Microsoft that might have sensitive information. I know it’s common sense, but, it happens to the best of us. I thought I’d just quickly mention that as a reminder more than anything else.
Hope you enjoy it,
Best