Лазурный: Сценарий для запуска или завершения нескольких виртуальных машин

Можно ли написать и сохранить какой-нибудь сценарий, который запускает azure powershell, затем аутентифицирует подписку на Azure, а затем запускает / завершает работу нескольких виртуальных машин за один шаг?

У меня 5 виртуальных машин. которые я использую регулярно в определенное незапланированное время, поэтому я не хочу выполнять шаги входа на портал Azure, запускать виртуальные машины одну за другой, а затем делать то же самое для их закрытия каждый раз, когда мне нужно их использовать! Мне нужно автоматизировать этот процесс.

1
задан 8 January 2016 в 19:12
6 ответов

Безусловно, вам следует используйте службу автоматизации 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/

С уважением

Станислав

1
ответ дан 3 December 2019 в 23:53

Для этого есть несколько решений.

У вас может быть сценарий Powershell в автоматизации Azure, который будет подключаться к вашей подписке (подпискам) и отключать или запускать серверы в зависимости от параметр.

Затем вы можете подключить к этим серверам веб-перехватчик, который можно будет где-нибудь подключить к кнопке HTTP Post, чтобы остановить или запустить их.

Или вы можете сделать то же самое с приложением C #, которое вы можете вызывать аналогичным образом. Преимущество этого подхода состоит в том, что вы можете выполнить аутентификацию в стеке HTTP перед тем, как принять веб-перехватчик

Лично у меня есть несколько серверов, управляемых из приложения API, которое подключено к приложению автоматизации на моем телефоне. Когда я выхожу из офиса, он выключает мой сервер разработки (и запускает его, когда я прихожу!)

0
ответ дан 3 December 2019 в 23:53

Вы можете использовать любой сервер в центре обработки данных для запуска запланированного сценария PowerShell. У Марка Хика есть хороший пост о том, как делать все это https://www.petri.com/manage-scheduled-tasks-windows-8-windows-server-2012-powershell-part-2 . Я бы добавил к этому, что вы захотите передать параметры входа в систему, и если вы хотите закрыть все на одном сервере, то что-то вроде get-VM | стоп-ВМ. Если вы хотите сначала приостановить службы на виртуальной машине, вам необходимо войти в удаленную оболочку PowerShell в цикле foreach (VM inVMList) {} для каждой виртуальной машины, но это не так сложно, если виртуальные машины находятся в том же домене, что и сервер. . в противном случае вам нужно будет использовать credssp для установления доверия между сервером и виртуальной машиной.

0
ответ дан 3 December 2019 в 23:53

Существует вызов 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>

Аналогичным образом, Стартовые роли могут запускать несколько виртуальных машин одновременно.

0
ответ дан 3 December 2019 в 23:53

Вы также можете использовать планировщик виртуальных машин Azure от SmiKar Software. AVMS, как она известна, будет подключаться к вашим подпискам Azure и позволит вам выбрать виртуальные машины и расписание включения или выключения в соответствии с требованиями.

Работает с виртуальными машинами Azure V1 и V2

http: //www.smikar. com / automate-schedule-power-azure-vms /

0
ответ дан 3 December 2019 в 23:53

Для тех, кто использует 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 ).

0
ответ дан 3 December 2019 в 23:53

Теги

Похожие вопросы