KadlinoBIT
KadlinoBIT

Reputation: 47

Reseting Azure VM deployed from an image using JSON template

I am deploying Azure VMs (with unmanaged disks), that are based on a VHD image. JSON templates used for deployment are stored in my Azure subscription. Sometimes I need to reset the machine to the original state - the manual way to achieve this through the Azure web portal is:

  1. Open the resource group, delete VM (while keeping other resources).
  2. Going to the storage account and deleting VHD that served as OS disk for the machine.
  3. Go back to the Resource group -> Deployment -> select last Deployment -> Redeploy.

I want to do this programmatically using PowerShell. All the steps are quite easily achievable except for the last one - running redeployment.

This is my PowerShell code:

# Authenticate to Azure Account
Login-AzAccount

$vm =  Get-AzVM | Out-GridView -Title "Select machine to be reset to factory state" -PassThru
$groupName = $vm.ResourceGroupName


#Stop the VM
Stop-AzureRmVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Force

#Delete VM
#Remove-AzureRmVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name

#Getting storage context, blob name and deleting VHD (blob)
$disk = $vm.StorageProfile.OsDisk
$storageAccount = Get-AzStorageAccount -ResourceGroupName "myStorageAccountResourceGroupName" -Name "myStorageAccountName"


#Get storage context
$storageKey = (Get-AzStorageAccountKey -ResourceGroupName $storageAccount.ResourceGroupName -Name $storageAccount.StorageAccountName)[0].Value
$context = New-AzStorageContext -StorageAccountName $storageAccount.StorageAccountName -StorageAccountKey $storageKey
$container = Get-AzStorageContainer -Context $context -Name 'vhds'
$blobName = $disk.Name + ".vhd"
$blob = Get-AzStorageBlob -Container $container.Name -Context $context -Blob $blobName

#Delete Blob
$blob | Remove-AzStorageBlob

Now for the last step - I can get the last Resource group deployment and set up a new deployment with -RollbackToLastDeployment parameter.

#Redeploy Group
$deployments = Get-AzResourceGroupDeployment $groupName
$deployment = $deployments[$deployments.size - 1]

New-AzResourceGroupDeployment -Name $deployment.DeploymentName -ResourceGroupName $groupName  -TemplateFile <Expects template in local storage> -RollbackToLastDeployment

The problem is that the New-AzResourceGroupDeployment command expects a JSON template that is on my local disk, but I have my templates stored in the Azure subscription.

Is there any way to use a template that is located in Azure subscription for redeployment of a resource group?

Upvotes: 0

Views: 699

Answers (1)

Joy Wang
Joy Wang

Reputation: 42123

No matter where is the template file located, you could convert/copy the template to the .json file in local, then upload it to the storage, then you will be able to use the -TemplateUri parameter to deploy the remote template.

Sample:

Set-AzCurrentStorageAccount -ResourceGroupName ManageGroup -Name {your-unique-name}

# get the URI with the SAS token
$templateuri = New-AzStorageBlobSASToken -Container templates -Blob storage.json -Permission r `
  -ExpiryTime (Get-Date).AddHours(2.0) -FullUri

# provide URI with SAS token during deployment
New-AzResourceGroup -Name ExampleGroup -Location "South Central US"
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateUri $templateuri

For more details, you could refer to this link.

Update:

Seems we could not find the uri of the Template(preview) in the portal, my workaround is copy the template as a .json file in local manually, then upload to the azure blob storage, then use the sample above.

Follow the steps:

1.In the portal, click the View Template, you can copy the template and save it as a .json file in local.

enter image description here

2.Then go to the container of your storage account, upload the .json file.

enter image description here

3.Click the ... of your .json file -> Generate SAS -> Generate blob SAS token and URL, copy the Blob SAS URL, it is the $templateuri what you need in the New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateUri $templateuri. Or you can use New-AzStorageBlobSASToken generate it like the sample above.

enter image description here

enter image description here

Upvotes: 0

Related Questions