使用JSON模板重置从映像部署的Azure VM

时间:2019-05-15 08:48:23

标签: azure-powershell

我正在部署基于VHD映像的Azure VM(具有不受管理的磁盘)。用于部署的JSON模板存储在我的Azure订阅中。 有时我需要将计算机重置为原始状态-通过Azure Web门户实现此目标的手动方法是:

  1. 打开资源组,删除VM(同时保留其他资源)。
  2. 转到存储帐户并删除用作计算机OS磁盘的VHD。
  3. 返回到“资源”组->部署->选择上一个部署->重新部署。

我想使用PowerShell以编程方式执行此操作。除最后一个步骤-运行重新部署外,所有步骤都非常容易实现。

这是我的PowerShell代码:

# 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

现在进入最后一步-我可以获得最后一个资源组部署,并使用 -RollbackToLastDeployment 参数设置一个新部署。

#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

问题是 New-AzResourceGroupDeployment 命令需要本地磁盘上的JSON模板,但是我的模板存储在Azure订阅中。

是否可以使用Azure订阅中的模板来重新部署资源组?

1 个答案:

答案 0 :(得分:0)

无论模板文件位于何处,都可以将模板转换/复制到本地的.json文件中,然后将其上传到存储中,然后就可以使用-TemplateUri参数以部署远程模板。

示例:

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

有关更多详细信息,您可以参考此link

更新

似乎我们无法在门户网站中找到Template(preview)的uri,我的解决方法是将模板作为.json文件手动复制到本地,然后上传到Azure Blob存储,然后使用示例以上。

执行以下步骤:

1。在门户中,单击View Template,您可以复制模板并将其另存为本地的。json文件。

enter image description here

2。然后转到您的存储帐户的容器,上传.json文件。

enter image description here

3。单击...文件中的.json-> Generate SAS-> Generate blob SAS token and URL,复制Blob SAS URL,它就是{{1} } $templateuri中的需求。或者,您可以像上面的示例一样使用New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateUri $templateuri生成它。

enter image description here

enter image description here