web-dev-qa-db-ja.com

Azure:複数のVMを起動またはシャットダウンするスクリプト

Azure powershellを起動し、Azureサブスクリプションを認証して、複数のVMを1つのステップで開始/シャットダウンするようなスクリプトを記述して保存することは可能ですか?

特定の予定外の時間に定期的に使用するVMが5つあるので、Azureポータルにログインし、VMを1つずつ起動してから、使用する必要があるたびに同じようにシャットダウンする手順を実行したくありません。 !!このプロセスを自動化する必要があります。

1
Sisyphus

間違いなく、Azure Automationを使用して、PowerShellスクリプトをスケジュールどおりに実行し、AzureでVMをシャットダウンまたは開始する必要があります。これは、MicrosoftWebサイトですでに十分に文書化されています。

これを行う方法を段階的に説明する3つのリンクがあります

Azure Automation Runbookを使用してAzure仮想マシンを停止する https://gallery.technet.Microsoft.com/scriptcenter/Stop-Azure-Virtual-Machine-0b1fea97

AzureのシャットダウンVM Azure Automationで http://blogs.technet.com/b/georgewallace/archive/2014/11/05/shutting-down-a-Azure -vm-with-Azure-automation.aspx

Azure Automationを使用して営業時間中にのみVMを実行する https://blogs.endjin.com/2015/01/using-Azure-automation-to-run-vms-during-office-hours-only/ ==

よろしく

スタニスラス

REST(従来のVMを使用していると仮定)を使用してそれを行うService Management API呼び出しがあります。何らかの理由で、これはPowerShellコマンドレットに実装されていませんでした(おそらく可能です)助ける :) )

Shutdown Roles をご覧ください。このAPIは、一度に1つ以上のVMをシャットダウン(およびオプションで割り当て解除)できます。

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

同様に、 Start Roles は、一度に複数のVMを開始できます。

0
proteus

これには多くの解決策があります

AzureオートメーションにPowershellスクリプトを含めることができます。このスクリプトは、サブスクリプションに接続し、パラメーターに応じてサーバーをシャットダウンまたは起動します。

次に、それらのサーバーにWebhookを接続して、どこかでHTTPPostボタンに接続してサーバーを停止または開始することができます。

または、同様の方法で呼び出すことができるc#アプリで同様のことを行うことができます。このアプローチの利点は、Webhookを受け入れる前にHTTPスタックで認証を行うことができることです。

個人的には、電話の自動化アプリに接続されているAPIアプリから管理されているサーバーがいくつかあります。私がオフィスを離れると、開発サーバーがシャットダウンされます(そして、到着したときに起動されます!)

0
Michael B

データセンター内の任意のサーバーを使用して、スケジュールされたPowerShellスクリプトを実行できます。 Mark Hickは、このすべてを行うことについて良い投稿をしています https://www.petri.com/manage-scheduled-tasks-windows-8-windows-server-2012-powershell-part-2 。これに加えて、ログインパラメータを渡したいと思います。また、1つのサーバーですべてをシャットダウンしたい場合は、get-VM |停止-VM。最初にVMでサービスを静止したい場合は、各VMのforeach(VM inVMList){}ループでリモートPowerShellに入る必要があります。 =ただし、VMがサーバーと同じドメインにある場合、これはそれほど難しくありません。そうでない場合は、credsspを使用してサーバーとVMの間に信頼を作成する必要があります。

0
DeepFat

Resource ManagerAPIを使用している場合は、複数のVMを並行して再起動するために作成したスクリプトを次に示します。 Restart-AzureRmVMは、a VMの再起動が完了するまで戻らないため、このスクリプトはバックグラウンドジョブなどの複数のコマンドを開始します。

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
EM0

SmiKarSoftwareのAzure仮想マシンスケジューラを使用することもできます。既知のAVMSは、Azureサブスクリプションに接続し、VMを選択して、必要に応じて電源のオンまたはダウンのスケジュールを設定できるようにします。

V1およびV2Azure仮想マシンで動作します

http://www.smikar.com/automate-scheduled-power-Azure-vms/

0
James