我们的服务器在 Azure 上。最近我们收到了一封计划维护的邮件通知。但是,检查仪表板时,它显示没有计划维护活动。
但是,当我打开单个虚拟机的仪表板时,它会显示与维护相关的消息。我无法打开每个虚拟机并检查该消息。
是不是只有我一个人遇到同样的问题,还是其他人也遇到了同样的问题?
谢谢。
答案1
不只是你遇到过这种情况 - 我们也遇到过这种情况。在我们的案例中,VM 刀片在我们收到电子邮件通知前 24-36 小时显示计划维护。在同一时间段内,“计划维护”刀片没有显示任何即将进行的维护。
今天早上,在收到正式的电子邮件通知后,“计划维护”刀片正确显示即将进行的维护。
答案2
答案3
AzureRM PowerShell
您可以使用 Azure Powershell 查看虚拟机的维护计划时间。使用 -status 参数时,可从 Get-AzureRmVM cmdlet 获取计划维护信息。
Get-AzureRmVM -ResourceGroupName rgName -Name vmName -Status
您还可以使用 Get-AzureRmVM 而不指定 VM 来获取资源组中所有 VM 的维护状态。
Get-AzureRmVM -ResourceGroupName rgName -Status
以下 PowerShell 函数获取您的订阅 ID 并打印出计划进行维护的虚拟机列表。
function MaintenanceIterator
{
Select-AzureRmSubscription -SubscriptionId $args[0]
$rgList= Get-AzureRmResourceGroup
for ($rgIdx=0; $rgIdx -lt $rgList.Length ; $rgIdx++)
{
$rg = $rgList[$rgIdx]
$vmList = Get-AzureRMVM -ResourceGroupName $rg.ResourceGroupName
for ($vmIdx=0; $vmIdx -lt $vmList.Length ; $vmIdx++)
{
$vm = $vmList[$vmIdx]
$vmDetails = Get-AzureRMVM -ResourceGroupName $rg.ResourceGroupName -Name $vm.Name -Status
if ($vmDetails.MaintenanceRedeployStatus )
{
Write-Output "VM: $($vmDetails.Name) IsCustomerInitiatedMaintenanceAllowed: $($vmDetails.MaintenanceRedeployStatus.IsCustomerInitiatedMaintenanceAllowed) $($vmDetails.MaintenanceRedeployStatus.LastOperationMessage)"
}
}
}
}
Azure 元数据服务
计划事件是一种 Azure 元数据服务,可让您的应用程序有时间准备虚拟机维护。它提供有关即将发生的维护事件(例如重新启动)的信息,以便您的应用程序可以做好准备并减少中断。它适用于所有 Azure 虚拟机类型,包括 Windows 和 Linux 上的 PaaS 和 IaaS。
# How to get scheduled events
function Get-ScheduledEvents($uri)
{
$scheduledEvents = Invoke-RestMethod -Headers @{"Metadata"="true"} -URI $uri -Method get
$json = ConvertTo-Json $scheduledEvents
Write-Host "Received following events: `n" $json
return $scheduledEvents
}
# How to approve a scheduled event
function Approve-ScheduledEvent($eventId, $docIncarnation, $uri)
{
# Create the Scheduled Events Approval Document
$startRequests = [array]@{"EventId" = $eventId}
$scheduledEventsApproval = @{"StartRequests" = $startRequests; "DocumentIncarnation" = $docIncarnation}
# Convert to JSON string
$approvalString = ConvertTo-Json $scheduledEventsApproval
Write-Host "Approving with the following: `n" $approvalString
# Post approval string to scheduled events endpoint
Invoke-RestMethod -Uri $uri -Headers @{"Metadata"="true"} -Method POST -Body $approvalString
}
function Handle-ScheduledEvents($scheduledEvents)
{
# Add logic for handling events here
}
######### Sample Scheduled Events Interaction #########
# Set up the scheduled events URI for a VNET-enabled VM
$localHostIP = "169.254.169.254"
$scheduledEventURI = 'http://{0}/metadata/scheduledevents?api-version=2017-03-01' -f $localHostIP
# Get events
$scheduledEvents = Get-ScheduledEvents $scheduledEventURI
# Handle events however is best for your service
Handle-ScheduledEvents $scheduledEvents
# Approve events when ready (optional)
foreach($event in $scheduledEvents.Events)
{
Write-Host "Current Event: `n" $event
$entry = Read-Host "`nApprove event? Y/N"
if($entry -eq "Y" -or $entry -eq "y")
{
Approve-ScheduledEvent $event.EventId $scheduledEvents.DocumentIncarnation $scheduledEventURI
}
}