重新创建Azure VM时,如何重新配置​​Azure诊断扩展

时间:2016-03-03 16:49:46

标签: powershell azure azure-resource-manager

我需要对现有计算机上不允许的Azure Resource Manager虚拟机进行更改,例如更改可用性组。因此,我必须删除并重新创建计算机,将现有磁盘,网络适配器等连接到新VM。我有一个PowerShell脚本来执行此操作,但我遇到了虚拟机扩展的问题。

这是我的代码:

$NewVMConfig = New-AzureRmVMConfig -VMName $VM.Name -VMSize $VM.HardwareProfile.VmSize
$NewVMConfig = Set-AzureRmVMOSDisk -VM $NewVMConfig -Name $VM.StorageProfile.OSDisk.Name -VhdUri $VM.StorageProfile.OSDisk.VHD.Uri -CreateOption attach -Windows
foreach ($disk in $vm.StorageProfile.DataDisks) {
    $NewVMConfig = Add-AzureRmVMDataDisk -VM $NewVMConfig -Name $disk.Name -VhdUri $disk.Vhd.Uri -Caching $disk.Caching -DiskSizeInGB $disk.DiskSizeGB -CreateOption attach -Lun $disk.Lun
}
$NewVMConfig.AvailabilitySetReference = $VM.AvailabilitySetReference
$NewVMConfig.DiagnosticsProfile = $VM.DiagnosticsProfile
$NewVMConfig.Extensions = $VM.Extensions
$NewVMConfig.NetworkProfile = $VM.NetworkProfile
$location = $VM.Location
$resourceGroupName = $VM.ResourceGroupName

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

# Recreate machine
New-AzureRmVM -ResourceGroupName $resourceGroupName -Location $location -VM $NewVMConfig 

注意这一行:

$NewVMConfig.Extensions = $VM.Extensions

脚本运行时没有任何错误,但新VM没有与原始VM相同的扩展名。诊断扩展已经消失,现在它的BGInfo扩展名不在原始机器上。

我可以使用Remove-AzureRmVMExtension命令删除BGInfo扩展,但是我没有成功重建诊断扩展。我已经尝试Set-AzureRmVMExtensionSet-AzureRmVMDiagnosticsExtension都无济于事。

2 个答案:

答案 0 :(得分:1)

那些VM扩展命令尚不支持ARM。因此,我建议您使用ARM模板。有一个quick-start template specifically for Windows VM with diagnostics extension on GitHub。您可以下载并修改它以满足您的需求,例如为VM指定​​VHD。并且,使用New-AzureRmResourceGroupDeployment部署您的虚拟机。

对于您的情况,将上述模板与201-specialized-vm-in-existing-vnet模板相结合可满足您的需求。

注意:201-vm-diagnostics-extension-windows模板部署具有诊断扩展的Windows VM,而201-specialized-vm-in-existing-vnet模板部署具有现有VNet和VHD的VM

有关此内容的详情,请参阅Create a Windows Virtual machine with monitoring and diagnostics using Azure Resource Manager Template

有关创建ARM模板的详细信息,请参阅Authoring Azure Resource Manager templates

有关部署ARM模板的详细信息,请参阅Deploy a Resource Group with Azure Resource Manager template

答案 1 :(得分:0)

Jack Zeng对虚拟机模板的回答向我展示了我尝试重新配置Azure诊断扩展时缺少的内容。

关键是,当您获得VM并查看Extensions属性(或ExtensionsText属性)时,它不包含扩展的受保护设置。 (这是他们受到保护的一种方式。)因此,您没有重新创建扩展所需的所有信息。您必须重建受保护的设置,这些设置因扩展名而异,因此您需要知道特定扩展所需的内容。 Jack提供链接的虚拟机模板显示Azure诊断扩展的受保护设置所需的信息,即存储帐户名称,密钥和端点。

重新创建虚拟机后,运行以下代码会成功重新配置诊断程序。在此代码中,$VM是我们在重新创建计算机之前调用Get-AzureRmVM获得的原始虚拟机对象。

$diagnosticsExtension = $VM.Extensions | Where { $_.Name -eq 'Microsoft.Insights.VMDiagnosticsSettings' }

# The $VM.Extensions.Settings property does not correctly return the values of the different settings.
# Instead, use the $VM.ExtensionsText property to get the old settings.
$oldSettings = $VM.ExtensionsText | ConvertFrom-Json | Where { $_.Name -eq 'Microsoft.Insights.VMDiagnosticsSettings' } | foreach {$_.'properties.settings'}

# Need settings in a hash table.
$settings = @{
    xmlCfg = $oldSettings.xmlCfg; 
    StorageAccount = $oldSettings.StorageAccount
}

$storageAccounts = Get-AzureRmStorageAccount
$storageAccount = $storageAccounts | Where { $_.StorageAccountName -eq $settings.StorageAccount }
$storageAccountKeys = $storageAccount | Get-AzureRmStorageAccountKey

$protectedSettings = @{
    storageAccountName = $settings.StorageAccount;
    storageAccountKey = $storageAccountKeys.Key1;
    storageAccountEndPoint = "https://core.windows.net/"
}

Write-Host "Reconfiguring Azure diagnostics extension on $Name..."
$result = Set-AzureRmVMExtension -ResourceGroupName $newVM.ResourceGroupName -VMName $newVM.Name  -Name $diagnosticsExtension.name -Publisher $diagnosticsExtension.Publisher -ExtensionType $diagnosticsExtension.VirtualMachineExtensionType -TypeHandlerVersion $diagnosticsExtension.TypeHandlerVersion -Settings $settings -ProtectedSettings $protectedSettings -Location $diagnosticsExtension.Location

请注意,我正在运行Azure PowerShell扩展的1.2.1版。在此版本中,Set-AzureRmVMDiagnosticsExtension似乎已被破坏,因此我没有使用它。