Можно ли написать и сохранить какой-нибудь сценарий, который запускает azure powershell, затем аутентифицирует подписку на Azure, а затем запускает / завершает работу нескольких виртуальных машин за один шаг?
У меня 5 виртуальных машин. которые я использую регулярно в определенное незапланированное время, поэтому я не хочу выполнять шаги входа на портал Azure, запускать виртуальные машины одну за другой, а затем делать то же самое для их закрытия каждый раз, когда мне нужно их использовать! Мне нужно автоматизировать этот процесс.
Безусловно, вам следует используйте службу автоматизации Azure для запуска по расписанию сценария PowerShell для завершения работы или запуска виртуальной машины в Azure. Это уже хорошо задокументировано на веб-сайте Microsoft.
Вот 3 ссылки, которые шаг за шагом объясняют, как это сделать.
Остановить виртуальную машину Azure с помощью Azure Automation Runbook 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/
С уважением
Станислав
Для этого есть несколько решений.
У вас может быть сценарий Powershell в автоматизации Azure, который будет подключаться к вашей подписке (подпискам) и отключать или запускать серверы в зависимости от параметр.
Затем вы можете подключить к этим серверам веб-перехватчик, который можно будет где-нибудь подключить к кнопке HTTP Post, чтобы остановить или запустить их.
Или вы можете сделать то же самое с приложением C #, которое вы можете вызывать аналогичным образом. Преимущество этого подхода состоит в том, что вы можете выполнить аутентификацию в стеке HTTP перед тем, как принять веб-перехватчик
Лично у меня есть несколько серверов, управляемых из приложения API, которое подключено к приложению автоматизации на моем телефоне. Когда я выхожу из офиса, он выключает мой сервер разработки (и запускает его, когда я прихожу!)
Вы можете использовать любой сервер в центре обработки данных для запуска запланированного сценария PowerShell. У Марка Хика есть хороший пост о том, как делать все это https://www.petri.com/manage-scheduled-tasks-windows-8-windows-server-2012-powershell-part-2 . Я бы добавил к этому, что вы захотите передать параметры входа в систему, и если вы хотите закрыть все на одном сервере, то что-то вроде get-VM | стоп-ВМ. Если вы хотите сначала приостановить службы на виртуальной машине, вам необходимо войти в удаленную оболочку PowerShell в цикле foreach (VM inVMList) {} для каждой виртуальной машины, но это не так сложно, если виртуальные машины находятся в том же домене, что и сервер. . в противном случае вам нужно будет использовать credssp для установления доверия между сервером и виртуальной машиной.
Существует вызов 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>
Аналогичным образом, Стартовые роли могут запускать несколько виртуальных машин одновременно.
Вы также можете использовать планировщик виртуальных машин Azure от SmiKar Software. AVMS, как она известна, будет подключаться к вашим подпискам Azure и позволит вам выбрать виртуальные машины и расписание включения или выключения в соответствии с требованиями.
Работает с виртуальными машинами Azure V1 и V2
http: //www.smikar. com / automate-schedule-power-azure-vms /
Для тех, кто использует API Resource Manager , вот сценарий, который я написал для параллельного перезапуска нескольких виртуальных машин. 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 ).