Azure: Script para iniciar ou encerrar várias VMs

1

É possível escrever e salvar algum tipo de script que inicie o azure powershell, depois autentique a assinatura do azure e inicie / desligue várias VMs em uma etapa?

Tenho 5 VMs que uso regularmente em horários não programados específicos, por isso não quero executar as etapas de logon no azure portal, iniciar VMs uma por uma e fazer o mesmo para desativá-las, sempre que precisar usá-los! Eu preciso automatizar esse processo.

    
por Sisyphus 08.01.2016 / 18:12

6 respostas

1

Definitivamente, você deve usar o Azure Automation para executar, na programação, um Script do PowerShell para desligar ou iniciar sua VM no Azure. Já está bem documentado no site da Microsoft.

Aqui estão 3 links que explicam passo a passo como fazer isso

Parar a máquina virtual do Azure usando o Runbook de automação do Azure link

Encerrando uma VM do Azure com a automação do Azure link

Usando o Azure Automation para executar somente as VMs durante o horário comercial link

Atenciosamente

Stanislas

    
por 12.01.2016 / 14:10
0

Existem várias soluções para isso

Você pode ter um script Powershell na automação do Azure, que se conectará à (s) sua (s) assinatura (s) e desligará ou iniciará os servidores de acordo com um parâmetro.

Você pode então ter um webhook anexado a esses servidores, que você pode conectar a um botão HTTP Post em algum lugar para pará-los ou iniciá-los.

Ou você pode fazer uma coisa semelhante com um aplicativo c # que pode ser chamado de maneira semelhante. O benefício dessa abordagem é que você pode ter autenticação na pilha HTTP antes de aceitar o webhook

Pessoalmente, tenho alguns servidores gerenciados por um aplicativo de API, que está conectado a um aplicativo de automação no meu telefone. Quando saio do escritório, desligo meu servidor de desenvolvimento (e o inicio quando chego!)

    
por 09.01.2016 / 15:45
0

Você pode usar qualquer servidor em um datacenter para executar um script do PowerShell agendado. Mark Hick tem um bom post sobre como fazer isso link . Eu adicionaria a isso que você vai querer passar em parâmetros de login, e se você quiser desligar tudo em um servidor, então algo como get-VM | pare-VM. Se você quiser suspender os serviços primeiro na VM, será necessário entrar em um powershell remoto em um loop foreach (VM inVMList) {} para cada VM, mas isso não é difícil se as VMs estiverem no mesmo domínio que o servidor . se não, você precisará usar o credssp para criar confiança entre o servidor e a VM.

    
por 11.01.2016 / 09:37
0

Há uma chamada da API do Service Management que fará isso usando o REST (supondo que você esteja usando VMs clássicas). Por algum motivo, isso não foi implementado nos cmdlets do PowerShell (talvez você possa contribuir :))

Dê uma olhada nas Funções de desligamento Esta API pode ser encerrada (e, opcionalmente, desalocada) uma ou mais VMs de cada vez.

<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>

Da mesma forma, Iniciar funções pode iniciar várias VMs de cada vez.

    
por 12.01.2016 / 01:29
0

Você também pode usar o agendador do Virtual Machine do Azure da SmiKar Software. O AVMS, como é conhecido, se conectará às suas Assinaturas do Azure e permitirá que você selecione as VMs e um cronograma de ativação ou desativação adequado.

Funciona com máquinas virtuais Azure V1 e V2

link

    
por 10.09.2016 / 14:29
0

Para aqueles que usam a API Gerenciador de recursos , aqui está um script que eu escrevi para reiniciar várias VMs em paralelo. Restart-AzureRmVM não retorna até que uma VM termine a reinicialização, portanto, esse script inicia vários desses comandos como trabalhos em segundo plano.

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"
    }
}

Antes de chamar a função acima, você precisará fazer o login chamando

Login-AzureRmAccount

Observe que ele salva temporariamente seu token de login em disco e o carrega em cada trabalho em segundo plano, caso contrário, você receberá um erro sobre não estar logado no trabalho em segundo plano (consulte link ).

    
por 05.12.2016 / 16:12