Я создаю учетную запись службы автоматизации Azure с модулем Runbook PowerShell. Сценарий просто перебирает каждую виртуальную машину в группе ресурсов и удаляет все файлы в определенной папке.
$ResourceGroup = '<<myResourceGroup>>'
$TargetDir = '<targetDirectoryPath/.'
$TargetCommand = 'rm -rfv ' + $TargetDir
try
{
$message = Connect-AzAccount -Identity
$myAzureVMs = Get-AzVM -ResourceGroupName $ResourceGroup -status | Where-Object {$_.PowerState -eq "VM running" -and $_.StorageProfile.OSDisk.OSType -eq "Linux"}
if ($myAzureVMs.Name.Count -gt 1)
{
For($val = 0; $val -le $myAzureVMs.Name.Count-1; $val++)
{
# the script hangs here
$message = Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroup -Name $myAzureVMs.Name[$val] -CommandId 'RunShellScript' -ScriptString $TargetCommand
}
}
Write-Output "DONE !!"
}
catch
{
Write-Error -Message $_.Exception
throw $_.Exception
}
Сценарий работает нормально, но проблема в том, что если виртуальная машина не в порядке или имеет какие-то проблемы с подключением, сценарий зависает прямо там. Никаких ошибок или исключений не выдается. Он просто продолжает ждать и в конечном итоге истекает через несколько часов.
Мой вопрос: есть ли способ проверить, может ли виртуальная машина быть подключена или нет (или любое лучшее решение), а затем должен выполняться только сценарий. Я также пытался поместить Invoke-AzVMRunCommand в блок try-catch, чтобы поглотить исключение и перейти к следующей виртуальной машине, но тщетно. Он просто зависает на этой виртуальной машине, и никаких исключений не возникает.
Прежде чем собирать «статус виртуальной машины» или соответствующие сведения о виртуальной машине, я бы посоветовал использовать start-AzVM
Команда Azure PowerShell, чтобы проверить, подключена ли виртуальная машина.
Затем сценарий следует вызывать на основе возвращаемого им состояния подключения. Вы можете избежать времени ожидания, делая это во время выполнения оставшегося скрипта.
$vmstatus = start-AzVM -Name <VMName> -ResourcegroupName <resourcegroupname>
if ($vmstatus.status -eq "succeeded") {
write-host "connected"
}
Выход:
Кроме того, проверьте Test-AzNetworkWatcherConnectivity, включив Наблюдатель за сетями в своей среде.
Решено. На самом деле команда запуска использует агент виртуальной машины для выполнения задачи, а на некоторых виртуальных машинах этот агент не готов должным образом, и поэтому происходит зависание. Итак, добавлена дополнительная проверка для проверки состояния агента виртуальной машины на каждой виртуальной машине перед выполнением операции, и это решило проблему.