У меня есть скрипт powershell, который останавливает / запускает виртуальную машину параллельно в определенное время, используя Jenkins.В этом сценарии используется командлет -AsJob powershell. Таким образом, виртуальные машины показывают, что они остановлены в выводе Jenkins, но на самом деле они находятся в процессе освобождения на портале Azure.
У меня также есть таймер сна на 5 минут для получения команды Get-AzureRmVM -Status.
Вопрос: - Есть ли способ зациклить его, где я могу проверить состояниеВиртуальные машины и, если виртуальные машины НЕ находятся в состоянии «Выделено» или «Работает», сценарий выполняет проверку примерно через минуту или около того.Как только виртуальные машины наконец находятся в освобожденном или запущенном состоянии, сценарий / задание завершается успешно.
Фрагмент кода
$JobList = @()
foreach ($VM in $vms)
{
if ($env:OPTION -eq "start")
{
Write-Output "Starting :- $($VM.Name) in $($VM.ResourceGroupName)"
$JobList += Start-AzureRmVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -AsJob -Verbose
Write-Output "$($VM.Name) has started successfully `n"
Write-Output "--------------------------------------------------"
}
elseif ($env:OPTION -eq "stop")
{
Write-Output "Deallocating :- $($VM.Name) in $($VM.ResourceGroupName)"
$JobList += Stop-AzureRmVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Force -AsJob -Verbose
Write-Output "$($VM.Name) has been deallocated successfully `n"
Write-Output "--------------------------------------------------"
}
else
{
Write-Output "ERROR!!! No option selected, select an option"
}
}
sleep 300
Write-Output "`n##############################################"
Write-Output "### Writing Status of VMs to Workspace ###"
Write-Output "##############################################"
Get-AzureRmVM -Status | Where-Object {($_.tags.ManagedBy -eq "blaah") -And ($_.tags.Environment -eq "stage")}
EDIT - этот код проверяет состояние виртуальной машины, чтобы увидеть,освобожден.Я не могу заставить его снова запустить цикл, потому что виртуальные машины находятся в состоянии Run. ![screenshot](https://i.stack.imgur.com/0hsho.png)
$vms = (Get-AzureRmResource | Where-Object {($_.tags.ManagedBy -eq "blaah") -And ($_.tags.Environment -eq "Stage")}
foreach ($VM in $VMs) {
$vmDetail = Get-AzureRmVM -Name $VM.Name -ResourceGroupName $VM.ResourceGroupName -Status
foreach ($vmDetail in $vmDetail.Statuses[1]) {
$VMStatusDetail = $vmDetail.DisplayStatus
if ($VMStatusDetail -ne "Stopped") {
Write-Output "Waiting for $($VM.Name) to deallocate"
Write-Output "State:- $($VM.Name) is $VMStatusDetail"
start-sleep -s 5
}
else {
Write-Output "State:- $($VM.Name) is $VMStatusDetail"
}
}
}