How to Create Azure VM with PowerShell Script

In this article I will show you how you can create Azure VM with Azure Powershell Script that will help you to provision your VM in just few Sec.

Always remember this custom Azure PowerShell script will create following resources-

  • Resource Group
  • Virtual Network with one Subnet
  • Network Security Group with NSG rule that will allow access to VMs
  • Virtual Machine with CentOS operating system

Let’s start to understand each steps first before jumping to collect master script 🙂

Define variables for networking Configuration

$ResourceGroup = ""
$Location = ""
$vNetName = ""
$AddressSpace = "" # Format 10.10.0.0/16
$SubnetIPRange = "" # Format 10.10.1.0/24
$SubnetName = ""
$nsgName = ""
$StorageAccount = "" # Name must be unique. 
# Note- Storage account Name availability can be check using PowerShell command, Get-AzureRmStorageAccountNameAvailability -Name "Give your name" 

Create Resource Group and Storage Account for diagnostic

New-AzureRMResourceGroup -Name $ResourceGroup -Location $Location
New-AzureRMStorageAccount -Name $StorageAccount -ResourceGroupName $ResourceGroup -Location $Location -SkuName Standard_LRS

Create Virtual Network and Subnet

$vNetwork = New-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroup -Name $vNetName -AddressPrefix $AddressSpace -Location $location
 Add-AzureRmVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vNetwork -AddressPrefix $SubnetIPRange
 Set-AzureRmVirtualNetwork -VirtualNetwork $vNetwork

Create Network Security Group

$nsgRuleVMAccess = New-AzureRMNetworkSecurityRuleConfig -Name 'allow-vm-access' -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 22,3389 -Access Allow
 New-AzureRmNetworkSecurityGroup -ResourceGroupName $ResourceGroup -Location $location -Name $nsgName -SecurityRules $nsgRuleVMAccess

Define Variables needed for Virtual Machine

$vNet = Get-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroup -Name $vNetName
 $Subnet = Get-AzureRmVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vNet
 $nsg = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $ResourceGroup -Name $NsgName
 $vmName = "DemoVM"
 $pubName = "DemoPIP"
 $offerName = "centOS"
 $skuName = "7.5"
 $vmSize = "Standard_B1s"
 $pipName = "$vmName-pip"
 $nicName = "$vmName-nic"
 $osDiskName = "$vmName-OsDisk"
 $osDiskSize = "30"
 $osDiskType = "Premium_LRS"

Create Admin Credentials

$adminUsername = Read-Host 'Admin username'
$adminPassword = Read-Host -AsSecureString 'Admin password with least 12 characters'
$adminCreds = New-Object PSCredential $adminUsername, $adminPassword

Create a public IP and NIC

$pip = New-AzureRmPublicIpAddress -Name $pipName -ResourceGroupName $ResourceGroup -Location $location -AllocationMethod Static
$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $ResourceGroup -Location $location -SubnetId $Subnet.Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id

Set VM Configuration

$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize
Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id

Set VM operating system parameters

Set-AzureRmVMOperatingSystem -VM $vmConfig -Linux -ComputerName $vmName -Credential $adminCreds

Set boot diagnostic storage account

Set-AzureRmVMBootDiagnostics -Enable -ResourceGroupName $ResourceGroup -VM $vmConfig -StorageAccountName $StorageAccount

Set virtual machine source image

Set-AzureRmVMSourceImage -VM $vmConfig -PublisherName $pubName -Offer $offerName -Skus $skuName -Version 'latest'

Set OsDisk configuration

Set-AzureRmVMOSDisk -VM $vmConfig -Name $osDiskName -DiskSizeInGB $osDiskSize -StorageAccountType $osDiskType -CreateOption fromImage

Create the VM

New-AzureRmVM -ResourceGroupName $ResourceGroup -Location $location -VM $vmConfig

Master Script To Create VM-

Including all steps here is the master script that will create a Azure Virtual Machine including the vNet, NSG, Storage Account and Public IP that will allow VM to access at port 22 and 3389.

 # Define variables for networking part
  $ResourceGroup  = ""
  $Location       = ""
  $vNetName       = ""
  $AddressSpace   = "" # Format 10.10.0.0/16
  $SubnetIPRange  = "" # Format 10.10.1.0/24
  $SubnetName     = ""
  $nsgName        = ""
  $StorageAccount = ""
# Name must be unique. Name availability can be check using PowerShell command Get-AzStorageAccountNameAvailability -Name ""
 # Create Resource Groups and Storage Account for diagnostic
  New-AzureRmResourceGroup -Name $ResourceGroup -Location $Location
  New-AzureRmStorageAccount -Name $StorageAccount -ResourceGroupName $ResourceGroup -Location $Location -SkuName Standard_LRS
 # Create Virtual Network and Subnet
  $vNetwork = New-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroup -Name $vNetName -AddressPrefix $AddressSpace -Location $location
  Add-AzureRmVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vNetwork -AddressPrefix $SubnetIPRange
  Set-AzureRmVirtualNetwork -VirtualNetwork $vNetwork
 # Create Network Security Group
  $nsgRuleVMAccess = New-AzureRmNetworkSecurityRuleConfig -Name 'allow-vm-access' -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 22,3389 -Access Allow
  New-AzureRmNetworkSecurityGroup -ResourceGroupName $ResourceGroup -Location $location -Name $nsgName -SecurityRules $nsgRuleVMAccess
 # Define Variables needed for Virtual Machine
  $vNet       = Get-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroup -Name $vNetName
  $Subnet     = Get-AzureRmVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vNet
  $nsg        = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $ResourceGroup -Name $NsgName
  $vmName     = "Demo-VM"
  $pubName    = "DemoPiP"
  $offerName    = "centOS"
  $skuName    = "7.5"
  $vmSize     = "Standard_Ds1_v2"
  $pipName    = "$vmName-pip" 
  $nicName    = "$vmName-nic"
  $osDiskName = "$vmName-OsDisk"
  $osDiskSize = "30"
  $osDiskType = "Premium_LRS"
 # Create Admin Credentials
  $adminUsername = Read-Host 'Admin username'
  $adminPassword = Read-Host -AsSecureString 'Admin password with least 12 characters'
  $adminCreds    = New-Object PSCredential $adminUsername, $adminPassword
 # Create a public IP and NIC
  $pip = New-AzureRmPublicIpAddress -Name $pipName -ResourceGroupName $ResourceGroup -Location $location -AllocationMethod Static 
  $nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $ResourceGroup -Location $location -SubnetId $Subnet.Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
 # Set VM Configuration
  $vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize
  Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id
 # Set VM operating system parameters
  Set-AzureRmVMOperatingSystem -VM $vmConfig -Linux -ComputerName $vmName -Credential $adminCreds
 # Set boot diagnostic storage account
  Set-AzureRmVMBootDiagnostics -Enable -ResourceGroupName $ResourceGroup -VM $vmConfig -StorageAccountName $StorageAccount
 # Set virtual machine source image
  Set-AzureRmVMSourceImage -VM $vmConfig -PublisherName $pubName -Offer $offerName -Skus $skuName -Version 'latest'
 # Set OsDisk configuration
  Set-AzureRmVMOSDisk -VM $vmConfig -Name $osDiskName -DiskSizeInGB $osDiskSize -StorageAccountType $osDiskType -CreateOption fromImage
 # Create the VM
  New-AzureRmVM -ResourceGroupName $ResourceGroup -Location $location -VM $vmConfig
Avatar

About Shachindra Yadav

I, Shachindra Yadav, a Cloud Certified, DevOps and technology enthusiastic person, more passionate to learn and write blogs in my free time.

View all posts by Shachindra Yadav →