Можно ли написать и сохранить какой-то сценарий, который запускает Azure PowerShell, затем аутентифицирует подписку Azure, а затем запускает / закрывает несколько виртуальных машин за один шаг?
У меня есть 5 виртуальных машин, которые я использую регулярно в определенное незапланированное время, поэтому я не хочу выполнять шаги входа на портал Azure, запускать виртуальные машины одну за другой, а затем делать то же самое, чтобы их выключить, каждый раз, когда мне нужно их использовать. ! Мне нужно автоматизировать этот процесс.
Безусловно, вы должны использовать службу автоматизации Azure для запуска по расписанию сценария PowerShell для завершения работы или запуска виртуальной машины в Azure. Это уже хорошо документировано на веб-сайте Microsoft.
Вот 3 ссылки, которые шаг за шагом объясняют, как это сделать.
Остановка виртуальной машины Azure с помощью модуля Runbook автоматизации Azure https://gallery.technet.microsoft.com/scriptcenter/Stop-Azure-Virtual-Machine-0b1fea97
Завершение работы виртуальной машины Azure с помощью службы автоматизации Azure http://blogs.technet.com/b/georgewallace/archive/2014/11/05/shutting-down-a-azure-vm-with-azure-automation.aspx
Использование службы автоматизации Azure для запуска виртуальных машин только в рабочее время https://blogs.endjin.com/2015/01/using-azure-automation-to-run-vms-during-office-hours-only/
С уважением
Станислав
Существует вызов API управления службами, который сделает это за вас с помощью REST (при условии, что вы используете классические виртуальные машины). По какой-то причине это не было реализовано в командлетах PowerShell (возможно, вы можете внести свой вклад :))
Посмотри на Роли завершения работы Этот API может выключать (и при необходимости освобождать) одну или несколько виртуальных машин за раз.
<ShutdownRolesOperation xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<OperationType>ShutdownRolesOperation</OperationType>
<Roles>
<Name>name-of-virtual-machine</Name>
</Roles>
<PostShutdownAction>shutdown-action</PostShutdownAction>
</ShutdownRolesOperation>
Так же, Стартовые роли может запускать несколько виртуальных машин одновременно.
Вы можете использовать любой сервер в центре обработки данных для запуска запланированного сценария PowerShell. У Марка Хика есть хороший пост о том, как все это сделать https://www.petri.com/manage-scheduled-tasks-windows-8-windows-server-2012-powershell-part-2. Я бы добавил к этому, что вы захотите передать параметры входа в систему, и если вы хотите закрыть все на одном сервере, то что-то вроде get-VM | стоп-ВМ. Если вы хотите сначала приостановить службы на виртуальной машине, вам необходимо войти в удаленную оболочку PowerShell в цикле foreach (VM inVMList) {} для каждой виртуальной машины, но это не так сложно, если виртуальные машины находятся в том же домене, что и сервер. . в противном случае вам нужно будет использовать credssp для установления доверия между сервером и виртуальной машиной.
Есть несколько решений этого
У вас может быть сценарий Powershell в автоматизации Azure, который будет подключаться к вашей подписке (подпискам) и отключать или запускать серверы в зависимости от параметра.
Затем вы можете подключить к этим серверам веб-перехватчик, который вы можете где-нибудь подключить к кнопке HTTP Post, чтобы остановить или запустить их.
Или вы можете сделать то же самое с приложением C #, которое вы можете вызывать аналогичным образом. Преимущество этого подхода состоит в том, что вы можете пройти аутентификацию в стеке HTTP, прежде чем принимать веб-перехватчик.
Лично у меня есть несколько серверов, которыми управляет приложение API, которое подключено к приложению автоматизации на моем телефоне. Когда я выхожу из офиса, он выключает мой сервер разработки (и запускает его, когда я приезжаю!)
Вы также можете использовать планировщик виртуальных машин Azure от SmiKar Software. AVMS, как это известно, подключится к вашим подпискам Azure и позволит вам выбрать виртуальные машины и расписание включения или выключения в соответствии с требованиями.
Работает с виртуальными машинами Azure V1 и V2
Для тех, кто использует Менеджер ресурсов API вот сценарий, который я написал для параллельного перезапуска нескольких виртуальных машин. Restart-AzureRmVM
не возвращается, пока виртуальная машина не завершит перезапуск, поэтому этот сценарий запускает несколько таких команд, как фоновые задания.
function Restart-VMs
{
param
(
[Parameter(Mandatory=$true, HelpMessage="LIKE pattern for VM name (use * for all)")] [string] $vmNamePattern,
[Parameter(Mandatory=$true, HelpMessage="LIKE pattern for Resource Group name (use * for all)")] [string] $resourceGroupNamePattern
)
$vmsToRestart = Get-AzureRmVm | Where-Object { $_.Name -like $vmNamePattern -and $_.ResourceGroupName -like $resourceGroupNamePattern }
Write-Host "Restarting $($vmsToRestart.Length) VMs"
# Need to save the profile so that the login from Login-AzureRmAccount works in the background jobs
$profilePath = [System.IO.Path]::GetTempFileName()
Remove-Item $profilePath
Write-Host "Temporarily saving Azure profile to $profilePath"
Save-AzureRmProfile -Path $profilePath
$ErrorActionPreference = "Continue" # Continue restarting other machines if some fail
try
{
$restartScriptBlock =
{
param ($vmToRestart, $profilePath)
Select-AzureRmProfile -Path $profilePath | Out-Null
Write-Host "Restarting VM: $($vmToRestart.Name)"
try
{
Restart-AzureRmVM -Name $vmToRestart.Name -ResourceGroupName $vmToRestart.ResourceGroupName
}
catch
{
Write-Error "FAILED to restart VM: $($vmToRestart.Name)"
Write-Error -ErrorRecord $_
}
Write-Host "DONE restarting VM: $($vmToRestart.Name)"
}
$jobs = @()
foreach ($vmToRestart in $vmsToRestart)
{
$jobs += Start-Job -ScriptBlock $restartScriptBlock -ArgumentList $vmToRestart,$profilePath
}
Write-Host "Restart jobs started, waiting..."
Wait-Job -Job $jobs | Out-Null
Receive-Job -Job $jobs
Write-Host "DONE restarting $($vmsToRestart.Length) VMs"
}
finally
{
Write-Host "Deleting saved Azure profile $profilePath"
Remove-Item $profilePath -Force
$ErrorActionPreference = "Stop"
}
}
Перед вызовом вышеуказанной функции вам необходимо войти в систему, вызвав
Login-AzureRmAccount
Обратите внимание, что он временно сохраняет ваш токен входа на диск и загружает его в каждом фоновом задании, иначе вы получите сообщение об ошибке о том, что не вошли в систему в фоновом задании (см. https://github.com/Azure/azure-powershell/issues/1288).