Search code examples
azureazure-virtual-machineazure-rm-template

How do I output a generated adminPassword for a Virtual Machine?


I've created a Virtual Machine resource with a uniqueString() to generate a password. I now want to display the password in the "outputs". How do I do this?

Note: It does not seem possible to let the Parameters generate a uniqueString(), hence I need to retrieve the password from the VM somehow.


Solution

  • Just try the template below to create a windows VM with auto-generated password and account info output:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "type": "string",
          "metadata": {
            "description": "Username for the Virtual Machine."
          }
        },
        "adminPassword": {
          "type": "securestring",
          "defaultValue": "[concat('P', uniqueString(resourceGroup().id, parameters('adminUsername')), 'x', '!')]",
          "metadata": {
            "description": "Password for the Virtual Machine."
          }
        },
        "dnsLabelPrefix": {
          "type": "string",
          "defaultValue": "[toLower(concat(parameters('vmName'),'-', uniqueString(resourceGroup().id, parameters('vmName'))))]",
          "metadata": {
            "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
          }
        },
        "publicIpName": {
          "type": "string",
          "defaultValue": "myPublicIP",
          "metadata": {
            "description": "Name for the Public IP used to access the Virtual Machine."
          }
        },
        "publicIPAllocationMethod": {
          "type": "string",
          "defaultValue": "Dynamic",
          "allowedValues": [
            "Dynamic",
            "Static"
          ],
          "metadata": {
            "description": "Allocation method for the Public IP used to access the Virtual Machine."
          }
        },
        "publicIpSku": {
          "type": "string",
          "defaultValue": "Basic",
          "allowedValues": [
            "Basic",
            "Standard"
          ],
          "metadata": {
            "description": "SKU for the Public IP used to access the Virtual Machine."
          }
        },
    
        "OSVersion": {
          "type": "string",
          "defaultValue": "2019-Datacenter",
          "allowedValues": [
            "2008-R2-SP1",
            "2012-Datacenter",
            "2012-R2-Datacenter",
            "2016-Nano-Server",
            "2016-Datacenter-with-Containers",
            "2016-Datacenter",
            "2019-Datacenter",
            "2019-Datacenter-Core",
            "2019-Datacenter-Core-smalldisk",
            "2019-Datacenter-Core-with-Containers",
            "2019-Datacenter-Core-with-Containers-smalldisk",
            "2019-Datacenter-smalldisk",
            "2019-Datacenter-with-Containers",
            "2019-Datacenter-with-Containers-smalldisk"
          ],
          "metadata": {
            "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version."
          }
        },
        "vmSize": {
          "type": "string",
          "defaultValue": "Standard_D2_v3",
          "metadata": {
            "description": "Size of the virtual machine."
          }
        },
        "location": {
          "type": "string",
          "defaultValue": "[resourceGroup().location]",
          "metadata": {
            "description": "Location for all resources."
          }
        },
        "vmName": {
          "type": "string",
          "defaultValue": "simple-vm",
          "metadata": {
            "description": "Name of the virtual machine."
          }
        }
      },
      "variables": {
        "storageAccountName": "[concat('bootdiags', uniquestring(resourceGroup().id))]",
        "nicName": "myVMNic",
        "addressPrefix": "10.0.0.0/16",
        "subnetName": "Subnet",
        "subnetPrefix": "10.0.0.0/24",
        "virtualNetworkName": "MyVNET",
        "subnetRef": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]",
        "networkSecurityGroupName": "default-NSG"
      },
      "resources": [
        {
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "name": "[variables('storageAccountName')]",
          "location": "[parameters('location')]",
          "sku": {
            "name": "Standard_LRS"
          },
          "kind": "Storage",
          "properties": {}
        },
        {
          "type": "Microsoft.Network/publicIPAddresses",
          "apiVersion": "2020-06-01",
          "name": "[parameters('publicIPName')]",
          "location": "[parameters('location')]",
          "sku": {
            "name": "[parameters('publicIpSku')]"
          },
          "properties": {
            "publicIPAllocationMethod": "[parameters('publicIPAllocationMethod')]",
            "dnsSettings": {
              "domainNameLabel": "[parameters('dnsLabelPrefix')]"
            }
          }
        },
        {
          "type": "Microsoft.Network/networkSecurityGroups",
          "apiVersion": "2020-06-01",
          "name": "[variables('networkSecurityGroupName')]",
          "location": "[parameters('location')]",
          "properties": {
            "securityRules": [
              {
                "name": "default-allow-3389",
                "properties": {
                  "priority": 1000,
                  "access": "Allow",
                  "direction": "Inbound",
                  "destinationPortRange": "3389",
                  "protocol": "Tcp",
                  "sourcePortRange": "*",
                  "sourceAddressPrefix": "*",
                  "destinationAddressPrefix": "*"
                }
              }
            ]
          }
        },
        {
          "type": "Microsoft.Network/virtualNetworks",
          "apiVersion": "2020-06-01",
          "name": "[variables('virtualNetworkName')]",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
          ],
          "properties": {
            "addressSpace": {
              "addressPrefixes": [
                "[variables('addressPrefix')]"
              ]
            },
            "subnets": [
              {
                "name": "[variables('subnetName')]",
                "properties": {
                  "addressPrefix": "[variables('subnetPrefix')]",
                  "networkSecurityGroup": {
                    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
                  }
                }
              }
            ]
          }
        },
        {
          "type": "Microsoft.Network/networkInterfaces",
          "apiVersion": "2020-06-01",
          "name": "[variables('nicName')]",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPName'))]",
            "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
          ],
          "properties": {
            "ipConfigurations": [
              {
                "name": "ipconfig1",
                "properties": {
                  "privateIPAllocationMethod": "Dynamic",
                  "publicIPAddress": {
                    "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPName'))]"
                  },
                  "subnet": {
                    "id": "[variables('subnetRef')]"
                  }
                }
              }
            ]
          }
        },
        {
          "type": "Microsoft.Compute/virtualMachines",
          "apiVersion": "2020-06-01",
          "name": "[parameters('vmName')]",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
            "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]"
          ],
          "properties": {
            "hardwareProfile": {
              "vmSize": "[parameters('vmSize')]"
            },
            "osProfile": {
              "computerName": "[parameters('vmName')]",
              "adminUsername": "[parameters('adminUsername')]",
              "adminPassword": "[parameters('adminPassword')]"
            },
            "storageProfile": {
              "imageReference": {
                "publisher": "MicrosoftWindowsServer",
                "offer": "WindowsServer",
                "sku": "[parameters('OSVersion')]",
                "version": "latest"
              },
              "osDisk": {
                "createOption": "FromImage",
                "managedDisk": {
                  "storageAccountType": "StandardSSD_LRS"
                }
              },
              "dataDisks": [
                {
                  "diskSizeGB": 1023,
                  "lun": 0,
                  "createOption": "Empty"
                }
              ]
            },
            "networkProfile": {
              "networkInterfaces": [
                {
                  "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]"
                }
              ]
            },
            "diagnosticsProfile": {
              "bootDiagnostics": {
                "enabled": true,
                "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]"
              }
            }
          }
        }
      ],
      "outputs": {
        "hostname": {
          "type": "string",
          "value": "[reference(parameters('publicIPName')).dnsSettings.fqdn]"
        },
            "adminUsername": {
          "type": "string",
          "value": "[parameters('adminUsername')]"
        },
            "adminPassword": {
          "type": "string",
          "value": "[parameters('adminPassword')]"
        }
      }
    }
    

    deploy result by PowerShell:

    enter image description here

    The only thing that you need to specify is adminUserName.

    Connect to the VM my URL and account : enter image description here

    enter image description here