PowerShellを使ってvCenterのクラスター間でVMを移行し負荷分散を最適化する方法

PowerShellを活用して、VMware vCenterの異なるクラスター間で仮想マシン(VM)を移行し、リソースの負荷分散を最適化する方法を紹介します。企業の仮想環境では、クラスター内のリソース使用率が不均衡になることがあり、適切な負荷分散が求められます。手動でVMを移行することも可能ですが、大規模環境では管理の負担が大きくなります。

そこで、PowerShellのVMware PowerCLIを活用することで、スクリプトを用いた自動化が可能になります。本記事では、PowerCLIの基本的な使い方から、スクリプトを用いたVM移行の手順、負荷分散の最適化方法、エラーハンドリング、自動化の応用例まで、実践的な手法を解説します。

本記事を読むことで、PowerShellを利用したvCenterの管理スキルを向上させ、効率的な負荷分散を実現する方法を学ぶことができます。

目次

vCenterのクラスターと負荷分散の基本

vCenterのクラスターとは

VMware vCenterにおける「クラスター」は、複数のESXiホストを一つのグループとして管理する機能です。クラスター内のリソース(CPU、メモリ、ストレージなど)は仮想マシン(VM)によって共有され、適切に分配されることで高可用性とパフォーマンスの最適化が実現されます。

クラスターを利用することで、以下のメリットがあります。

  • リソースの最適化:複数のESXiホストのリソースを効率的に使用できる。
  • 高可用性(HA):ホスト障害時に自動的にVMを他のホストへ移行し、ダウンタイムを最小限に抑える。
  • 分散リソーススケジューラ(DRS):負荷を分散し、最適なホストへVMを自動的に配置する。

負荷分散の重要性

クラスター内のリソース使用率が偏ると、以下のような問題が発生する可能性があります。

  • 一部のホストに負荷が集中し、パフォーマンスが低下する。
  • 過負荷のホストでVMのレスポンスが悪化し、アプリケーションの動作に影響を与える。
  • 低負荷のホストが有効活用されないため、全体的なリソースの無駄が発生する。

そのため、適切な負荷分散を行い、各ESXiホストに均等にリソースを割り当てることが重要になります。VMの移行(vMotion)を活用することで、負荷を調整しながら最適なリソース配分を実現できます。

手動と自動の負荷分散の違い

負荷分散は、手動または自動で行うことができます。

方法特徴メリットデメリット
手動移行vCenterの管理画面から手動でVMを別のホストへ移行直感的に操作できる作業負担が大きく、リアルタイムな負荷調整が困難
自動移行 (DRS)VMware DRS機能を使用して自動で移行負荷を自動最適化、管理負担を軽減DRSライセンスが必要、カスタマイズが制限される
スクリプトを活用した移行PowerShellスクリプトでVMの移行を制御条件に応じた柔軟な移行が可能スクリプトの作成とメンテナンスが必要

本記事では、PowerShellスクリプトを活用した負荷分散の最適化に焦点を当て、vCenterのクラスター間でVMを効率的に移行する方法を詳しく解説します。

PowerCLIを使ったvCenterの管理

PowerCLIとは?

PowerCLI(VMware PowerCLI)は、VMware vSphere環境を管理するためのPowerShellモジュールです。これを使用することで、GUIを使わずにコマンドラインからESXiホスト、VM、クラスターなどを管理でき、自動化やスクリプトによる運用が可能になります。

PowerCLIを利用することで、以下のようなタスクを効率化できます。

  • vCenterへの接続とリソース管理
  • VMの作成、削除、設定変更
  • vMotionを使用したVMの移行
  • スナップショットの作成と管理
  • ESXiホストの監視と管理

PowerCLIのインストール方法

PowerCLIは、PowerShellのモジュールとして提供されており、以下のコマンドで簡単にインストールできます。

# PowerCLIのインストール
Install-Module -Name VMware.PowerCLI -Scope CurrentUser -Force

# モジュールのインポート
Import-Module VMware.PowerCLI

インストール後、以下のコマンドでPowerCLIが正しくインストールされているか確認できます。

Get-Module -ListAvailable VMware.PowerCLI

vCenterへの接続

PowerCLIを使用してvCenterに接続するには、以下のコマンドを実行します。

# vCenterサーバーに接続
Connect-VIServer -Server <vcenter-server> -User <username> -Password <password>

<vcenter-server>にはvCenterのアドレスを指定し、<username>と<password>には認証情報を入力します。認証情報を入力する際には、セキュリティのためにパスワードをプロンプトで入力する方法も推奨されます。

# セキュアなログイン(パスワード入力プロンプトを表示)
$cred = Get-Credential
Connect-VIServer -Server <vcenter-server> -Credential $cred

vCenterリソースの取得

接続後、PowerCLIを使用してvCenter内の情報を取得できます。例えば、クラスター内のESXiホストやVMのリストを取得するには、以下のコマンドを使用します。

# vCenter内のクラスター情報を取得
Get-Cluster

# クラスター内のホスト一覧を取得
Get-VMHost -Location "<cluster-name>"

# vCenter内の仮想マシン一覧を取得
Get-VM

VMの移行(基本コマンド)

PowerCLIを使用すると、VMを手動で移行(vMotion)することができます。以下のコマンドで、指定したVMを別のESXiホストへ移動できます。

# VMを別のESXiホストへ移行(vMotion)
Move-VM -VM "<vm-name>" -Destination "<destination-host>"

また、VMのストレージを移動するストレージvMotionも利用可能です。

# VMを別のデータストアへ移行(Storage vMotion)
Move-VM -VM "<vm-name>" -Datastore "<destination-datastore>"

PowerCLIを活用した自動化

PowerCLIを活用すると、複数のVMを一括で管理するスクリプトを作成できます。例えば、CPU使用率が高いホストにあるVMを別のホストへ移行するスクリプトを作成することも可能です。

本記事では、PowerCLIを使用してクラスター間でVMを移行し、負荷分散を最適化する方法について、具体的なスクリプトを交えながら詳しく解説していきます。

VMの移行に必要な準備

vCenter環境の確認

PowerCLIを使用してVMをクラスター間で移行する前に、環境を適切に設定する必要があります。以下の点を確認しておきましょう。

  1. vCenterサーバーが動作していること
  • vCenterが正常に稼働し、ESXiホストが適切に管理されていることを確認します。
  • Get-Cluster や Get-VMHost を使用して現在の環境を確認できます。
  1. 移行先のESXiホストに十分なリソースがあること
  • CPU、メモリ、ストレージの空き容量を事前にチェックし、移行後にパフォーマンス低下が発生しないようにします。
  • Get-VMHost コマンドで各ホストのリソース状況を確認できます。
  1. VMware vMotionが有効であること
  • vMotionを利用するには、ESXiホスト間で適切なネットワーク設定がされている必要があります。
  • vMotionが許可されているか確認するには、vCenterの設定または以下のPowerCLIコマンドを使用できます。
   Get-VMHost | Select-Object Name,State,ConnectionState
  1. クラスター間のネットワーク接続が問題ないこと
  • vMotionのネットワークが適切に設定されていることを確認し、接続の問題がないかテストします。
  • Test-Connection コマンドを使用して、ホスト間の通信を確認できます。
   Test-Connection -ComputerName "<destination-host>"

PowerCLIの認証情報設定

移行を自動化するスクリプトを実行する際、vCenterへの認証が必要になります。以下の方法で安全に認証情報を保存し、スクリプト内で利用できます。

# 認証情報を取得
$cred = Get-Credential

# vCenterに接続
Connect-VIServer -Server <vcenter-server> -Credential $cred

また、認証情報をスクリプト内で管理する場合、ConvertTo-SecureString を用いてパスワードを暗号化することが推奨されます。

# パスワードを暗号化して保存
"your_password" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\securepassword.txt"

# 暗号化したパスワードを読み込み
$securePassword = Get-Content "C:\securepassword.txt" | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential ("your_username", $securePassword)

# vCenterに接続
Connect-VIServer -Server <vcenter-server> -Credential $cred

vMotionに必要な権限設定

vCenterの管理ユーザーには、以下の権限が必要です。

  • Migrate(移行権限)
  • Resource Assign(リソース割り当て権限)
  • Host Configuration(ホスト設定変更権限)

これらの権限を持っていることを確認し、不足している場合は管理者に設定を依頼しましょう。

移行対象のVMを特定

移行を行うVMを特定し、リスト化することが重要です。以下のコマンドで、現在のVMの配置を確認できます。

# 指定したクラスター内のVM一覧を取得
Get-VM -Location "<cluster-name>"

# CPU使用率の高いVMを特定
Get-VM | Sort-Object -Property CpuUsageMhz -Descending | Select-Object -First 5 Name,CpuUsageMhz

特定のホストに属するVMを検索する場合は、以下のコマンドを使用します。

# 指定したESXiホスト上のVM一覧
Get-VM -Location (Get-VMHost "<host-name>")

このように、事前に移行対象のVMやホストの情報を取得し、スムーズな移行を準備します。

まとめ

VMの移行前に、vCenterの環境を適切に確認し、PowerCLIの認証設定や必要な権限を準備することが重要です。次のステップでは、PowerShellスクリプトを使用してVMを実際に移行する方法について詳しく解説します。

PowerShellスクリプトでVMを移行する方法

vMotionを利用したVMの移行

PowerCLIを使用すると、VMwareのvMotion機能を活用して、クラスター間で仮想マシン(VM)をスムーズに移行できます。PowerShellスクリプトを作成することで、手作業を減らし、運用の効率を向上させることができます。

単一のVMを移行する基本スクリプト

まずは、単一のVMを別のESXiホストへ移行する基本的なスクリプトを紹介します。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# 移行対象のVMと移行先ホストを指定
$vmName = "<vm-name>"
$destinationHost = Get-VMHost "<destination-host>"

# VMの移行実行(vMotion)
Move-VM -VM $vmName -Destination $destinationHost

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトでは、Move-VM コマンドを使用して、VMを指定したESXiホストに移行します。

複数のVMを一括で移行するスクリプト

特定のクラスター内のVMを、別のクラスターへ一括移行する場合は、以下のようなスクリプトを使用します。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# 移行元と移行先のクラスターを指定
$sourceCluster = Get-Cluster "<source-cluster>"
$destinationCluster = Get-Cluster "<destination-cluster>"

# 移行先のホストリストを取得
$destinationHosts = Get-VMHost -Location $destinationCluster

# 移行元クラスター内のすべてのVMを取得
$vmList = Get-VM -Location $sourceCluster

# VMごとに移行処理を実行
foreach ($vm in $vmList) {
    # ランダムな移行先ホストを選択
    $randomHost = Get-Random -InputObject $destinationHosts

    Write-Host "Moving VM: $($vm.Name) to $($randomHost.Name)"

    # VMを移行
    Move-VM -VM $vm -Destination $randomHost -Confirm:$false
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

VMの負荷を考慮した移行スクリプト

負荷の高いホストから、リソースに余裕のあるホストへVMを移行する場合、リソース情報を考慮したスクリプトを作成できます。以下のスクリプトでは、CPU使用率が高いホストのVMを、負荷の低いホストへ移動します。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# すべてのESXiホストのCPU使用率を取得
$hosts = Get-VMHost | Select-Object Name, @{Name="CpuUsage";Expression={$_.CpuUsageMhz}}, @{Name="CpuTotal";Expression={$_.CpuTotalMhz}}

# CPU使用率の高いホストを特定(上位50%)
$highLoadHosts = $hosts | Sort-Object -Property CpuUsage -Descending | Select-Object -First ([math]::Ceiling($hosts.Count * 0.5))

# CPU使用率の低いホストを特定(下位50%)
$lowLoadHosts = $hosts | Sort-Object -Property CpuUsage | Select-Object -First ([math]::Ceiling($hosts.Count * 0.5))

# 高負荷ホストのVMを低負荷ホストへ移行
foreach ($host in $highLoadHosts) {
    $vms = Get-VM -Location (Get-VMHost $host.Name)

    foreach ($vm in $vms) {
        $targetHost = Get-Random -InputObject $lowLoadHosts

        Write-Host "Moving VM: $($vm.Name) from $($host.Name) to $($targetHost.Name)"
        Move-VM -VM $vm -Destination (Get-VMHost $targetHost.Name) -Confirm:$false
    }
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトのポイントは、ESXiホストのCPU使用率を取得し、負荷の高いホストにあるVMを、負荷の低いホストへ移行する点です。

vMotionの進捗状況を監視する方法

PowerCLIには、VMの移行進捗を監視するためのコマンドも用意されています。例えば、以下のコマンドを実行すると、現在進行中のタスクの状況を確認できます。

Get-Task | Where-Object {$_.State -eq "Running"}

また、Move-VM コマンドに -RunAsync オプションを追加すると、スクリプトを非同期で実行し、移行の完了を待たずに次の処理に進めることができます。

Move-VM -VM "<vm-name>" -Destination "<destination-host>" -RunAsync

まとめ

PowerCLIを使用することで、単一VMの移行からクラスター間の大規模なVM移行まで、柔軟な管理が可能になります。本章で紹介したスクリプトを活用することで、手動操作を減らし、VMの負荷分散を自動化できます。次の章では、さらに高度な負荷分散の実装方法を解説します。

クラスター間の最適な負荷分散の実装

負荷分散の自動化とは?

vSphere環境では、ESXiホストごとにCPUやメモリの使用率が異なるため、負荷分散を適切に行うことでシステムの安定性を向上させることができます。手動でVMを移行することも可能ですが、大規模な環境では管理負担が大きくなります。

そこで、PowerShell(PowerCLI)を活用し、リソース使用率を分析しながら、最適なホストへVMを自動的に移行するスクリプトを実装することで、より効率的な負荷分散を実現できます。

負荷分散のためのリソース情報取得

まず、クラスター内の各ホストのリソース使用率を取得し、負荷の高いホストを特定します。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# クラスター内のESXiホストを取得
$cluster = Get-Cluster "<cluster-name>"
$hosts = Get-VMHost -Location $cluster | Select-Object Name, @{Name="CpuUsage";Expression={$_.CpuUsageMhz}}, @{Name="MemoryUsage";Expression={$_.MemoryUsageGB}}

# 負荷が高いホストを特定(CPU使用率とメモリ使用率の高いホスト)
$highLoadHosts = $hosts | Sort-Object -Property CpuUsage, MemoryUsage -Descending | Select-Object -First 3

# 負荷が低いホストを特定
$lowLoadHosts = $hosts | Sort-Object -Property CpuUsage, MemoryUsage | Select-Object -First 3

# 結果を表示
Write-Host "高負荷ホスト:"
$highLoadHosts | Format-Table -AutoSize

Write-Host "低負荷ホスト:"
$lowLoadHosts | Format-Table -AutoSize

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトでは、CPUとメモリの使用率が高いホストを上位3つ、低いホストを下位3つ抽出し、移行の対象を選定します。

負荷の高いホストから負荷の低いホストへVMを移行

次に、負荷の高いホストにあるVMを、リソースに余裕のあるホストへ移動するスクリプトを実装します。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# クラスター内のホスト情報を取得
$cluster = Get-Cluster "<cluster-name>"
$hosts = Get-VMHost -Location $cluster | Select-Object Name, @{Name="CpuUsage";Expression={$_.CpuUsageMhz}}, @{Name="MemoryUsage";Expression={$_.MemoryUsageGB}}

# 高負荷ホストと低負荷ホストを分類
$highLoadHosts = $hosts | Sort-Object -Property CpuUsage, MemoryUsage -Descending | Select-Object -First 3
$lowLoadHosts = $hosts | Sort-Object -Property CpuUsage, MemoryUsage | Select-Object -First 3

# 負荷の高いホストからVMを取得し、低負荷ホストへ移動
foreach ($host in $highLoadHosts) {
    $vms = Get-VM -Location (Get-VMHost $host.Name)

    foreach ($vm in $vms) {
        # ランダムに低負荷ホストを選択
        $targetHost = Get-Random -InputObject $lowLoadHosts

        Write-Host "Moving VM: $($vm.Name) from $($host.Name) to $($targetHost.Name)"

        # VMを移行(vMotion)
        Move-VM -VM $vm -Destination (Get-VMHost $targetHost.Name) -Confirm:$false
    }
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトでは、リソースの使用率を考慮し、負荷の高いホストにあるVMをランダムに負荷の低いホストへ移行します。

移行対象のVMをCPU・メモリ負荷で選定する

移行対象のVMも、単純にランダムで移動するのではなく、CPU・メモリ使用率が高いVMから移動するように最適化できます。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# クラスター内のESXiホストを取得
$cluster = Get-Cluster "<cluster-name>"
$hosts = Get-VMHost -Location $cluster

# CPUとメモリの負荷が高いホストを特定
$highLoadHosts = $hosts | Sort-Object -Property CpuUsage, MemoryUsage -Descending | Select-Object -First 3

# 負荷の低いホストを特定
$lowLoadHosts = $hosts | Sort-Object -Property CpuUsage, MemoryUsage | Select-Object -First 3

foreach ($host in $highLoadHosts) {
    # 負荷の高いVMを取得
    $vms = Get-VM -Location $host | Sort-Object -Property CpuUsageMhz, MemoryUsageGB -Descending | Select-Object -First 3

    foreach ($vm in $vms) {
        # 最も負荷の低いホストを選択
        $targetHost = $lowLoadHosts | Sort-Object -Property CpuUsage, MemoryUsage | Select-Object -First 1

        Write-Host "Moving high-load VM: $($vm.Name) from $($host.Name) to $($targetHost.Name)"

        # VMを移行(vMotion)
        Move-VM -VM $vm -Destination $targetHost.Name -Confirm:$false
    }
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトでは、以下の処理を自動化しています。

  1. クラスター内のESXiホストの負荷を分析
  2. 最も負荷の高いホストから、最も負荷の低いホストへ移行対象を決定
  3. 負荷の高いVM(CPU・メモリ使用率の高いVM)から優先的に移動

まとめ

  • PowerCLIを活用することで、手動での負荷分散を自動化できる
  • リソース使用率をリアルタイムで分析し、最適なVM移行を実現できる
  • CPUやメモリの負荷が高いVMを優先的に移行し、クラスターバランスを維持できる

次の章では、スクリプトの実行とエラーハンドリングについて解説します。

PowerShellスクリプトの実行とエラーハンドリング

スクリプトの実行方法

PowerCLIスクリプトを使用してVMを移行する際には、適切な手順でスクリプトを実行することが重要です。

1. PowerShellの実行ポリシーを確認する

PowerShellのスクリプト実行が制限されている場合、適切なポリシーを設定する必要があります。以下のコマンドで現在の実行ポリシーを確認できます。

Get-ExecutionPolicy

ポリシーが Restricted または Undefined になっている場合、スクリプトを実行できるように変更します。

Set-ExecutionPolicy RemoteSigned -Scope Process

※ RemoteSigned はローカルで作成したスクリプトを実行可能にする設定です。管理者権限が必要です。

2. PowerCLIを起動し、スクリプトを実行する

PowerCLIを開き、スクリプトが保存されているディレクトリに移動します。

cd C:\scripts

スクリプトを実行するには以下のように入力します。

.\vm-move.ps1

3. 実行時に変数を指定する方法

スクリプトを実行する際に、パラメータを指定して実行することも可能です。

.\vm-move.ps1 -SourceCluster "ClusterA" -DestinationCluster "ClusterB"

スクリプトのエラーハンドリング

PowerShellスクリプトを運用する際には、適切なエラーハンドリングを行うことで、問題が発生した際にスクリプトが停止せずに処理を続行できます。

1. Try-Catchを使用したエラーハンドリング

Try-Catch を使用すると、エラーが発生した際に特定の処理を実行できます。

try {
    # vCenterに接続
    $cred = Get-Credential
    Connect-VIServer -Server "<vcenter-server>" -Credential $cred -ErrorAction Stop

    # VMを移行
    Move-VM -VM "<vm-name>" -Destination (Get-VMHost "<destination-host>") -Confirm:$false
}
catch {
    Write-Host "エラー発生: $($_.Exception.Message)" -ForegroundColor Red
}
finally {
    # vCenterから切断
    Disconnect-VIServer -Confirm:$false
}

このスクリプトでは、以下の処理を行っています。

  • ErrorAction Stop を指定し、エラーが発生したら catch に処理を渡す
  • catch でエラーメッセージを表示
  • finally で必ず Disconnect-VIServer を実行し、vCenterとの接続を切断

2. ログファイルにエラー情報を記録

エラー発生時にログを記録し、後で問題を特定しやすくするために、ログファイルへの出力を追加します。

# ログファイルのパス
$logFile = "C:\logs\vm-move.log"

# エラーハンドリングを組み込んだVM移行スクリプト
try {
    # vCenterに接続
    $cred = Get-Credential
    Connect-VIServer -Server "<vcenter-server>" -Credential $cred -ErrorAction Stop

    # VMの移行
    Move-VM -VM "<vm-name>" -Destination (Get-VMHost "<destination-host>") -Confirm:$false

    # 成功メッセージをログに記録
    "[$(Get-Date)] INFO: VM <vm-name> の移行が成功しました。" | Out-File -Append $logFile
}
catch {
    # エラーメッセージをログに記録
    "[$(Get-Date)] ERROR: VM <vm-name> の移行中にエラー発生: $($_.Exception.Message)" | Out-File -Append $logFile
}
finally {
    # vCenterから切断
    Disconnect-VIServer -Confirm:$false
}

3. スクリプト実行結果をメール通知

エラーが発生した際に、管理者へメール通知を行うようにすることも可能です。

# メール設定
$smtpServer = "smtp.example.com"
$from = "[email protected]"
$to = "[email protected]"

try {
    # vCenterに接続
    $cred = Get-Credential
    Connect-VIServer -Server "<vcenter-server>" -Credential $cred -ErrorAction Stop

    # VM移行
    Move-VM -VM "<vm-name>" -Destination (Get-VMHost "<destination-host>") -Confirm:$false

    # 成功時のメッセージ
    $message = "VM <vm-name> の移行が成功しました。"
}
catch {
    # エラーメッセージを設定
    $message = "VM <vm-name> の移行中にエラー発生: $($_.Exception.Message)"
}
finally {
    # vCenterから切断
    Disconnect-VIServer -Confirm:$false
}

# メール送信
Send-MailMessage -SmtpServer $smtpServer -From $from -To $to -Subject "VM移行結果" -Body $message

よくあるエラーと対処方法

エラー原因解決策
Connect-VIServer : Could not connect to servervCenterのアドレスが間違っている / vCenterがダウンしているvCenterのステータスを確認し、アドレスを正しく入力
Move-VM : The operation is not allowed in the current stateVMが電源オンになっている場合、ホスト移行が許可されていないDRS(分散リソーススケジューラ)を確認し、vMotionが有効かチェック
The credentials provided were incorrect認証情報が誤っている正しいユーザー名・パスワードで認証する
There are insufficient licenses to complete this operationvMotionのライセンスが不足しているvSphereのライセンス設定を確認

まとめ

  • Try-Catchを使用してエラー時の処理を適切に実装
  • ログファイルにエラーを記録し、管理の効率を向上
  • メール通知を追加し、問題発生時に即座に対応可能に
  • よくあるエラーの原因と対策を把握し、スムーズな運用を実現

次の章では、スクリプトの自動実行とスケジュール設定について解説します。

自動化のためのスケジュール設定

PowerShellスクリプトを使ってVMの負荷分散を最適化する処理を定期的に実行することで、管理負担を軽減し、vCenter環境のリソース配分を継続的に最適化できます。本章では、Windowsのタスクスケジューラを活用してスクリプトを自動実行する方法を解説します。

タスクスケジューラを使用した自動実行

Windowsのタスクスケジューラを使用すれば、PowerShellスクリプトを定期的に実行できます。以下の手順でスケジュール設定を行います。

1. スクリプトを準備

スクリプトを C:\Scripts\vm-move.ps1 というファイル名で保存します。スクリプトの内容は、負荷分散を実行するものとします。

2. タスクスケジューラを開く

  1. Windowsの 「タスクスケジューラ」 を開く
  2. 「基本タスクの作成」 を選択
  3. 名前を 「VM_Migration_Script」 と設定し、「次へ」

3. 実行タイミングの設定

  • 「トリガー」 でスクリプトの実行タイミングを設定
  • 例:毎日 00:00(深夜)に実行

4. 実行するアクションの設定

  • 「操作」 で 「プログラムの開始」 を選択
  • プログラム/スクリプト に以下を入力
powershell.exe
  • 引数の追加(オプション) に以下を入力
-ExecutionPolicy Bypass -File "C:\Scripts\vm-move.ps1"

5. ユーザー権限の設定

  • 「ユーザーがログオンしているかどうかに関わらず実行する」 にチェックを入れる
  • 「最上位の特権で実行する」 にチェックを入れる

6. 設定の確認と完了

  • 設定を確認し、「完了」 をクリック

タスクの確認と手動実行

タスクが正しく設定されたか確認し、手動で実行テストを行います。

# 設定されたタスク一覧を表示
Get-ScheduledTask | Where-Object {$_.TaskName -like "*VM_Migration_Script*"}

# 手動実行
Start-ScheduledTask -TaskName "VM_Migration_Script"

ログの記録と監視

タスクの実行ログを記録し、実行状況を確認できるようにします。スクリプトの出力をログに記録する場合、以下のようにスクリプトを変更します。

# ログファイルを指定
$logFile = "C:\Logs\vm-move.log"

# ログに記録
"[$(Get-Date)] INFO: VM移行スクリプトを実行しました。" | Out-File -Append $logFile

また、タスクスケジューラの履歴を確認するには以下のPowerShellコマンドを使用できます。

Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational | Select-Object TimeCreated,Id,Message | Format-Table -AutoSize -Wrap

まとめ

  • Windowsタスクスケジューラを使用してスクリプトを定期実行
  • 毎日・毎週・特定のタイミングで自動実行が可能
  • 実行結果をログに記録し、エラー発生時に確認できるようにする
  • PowerShellでタスクの実行状況を確認・手動実行も可能

次の章では、特定の条件でVMを移行する応用スクリプトについて解説します。

応用例:特定の条件でVMを移行するスクリプト

VMの移行を手動で実施するだけでなく、特定の条件(CPU負荷、メモリ使用率、特定のタグが付与されたVMなど)に基づいて自動的に移行するスクリプト を作成することで、より効率的な負荷分散を実現できます。

本章では、CPU・メモリ負荷の閾値を超えた場合にVMを移行するスクリプト や 特定のタグが付いたVMだけを移行するスクリプト の実装方法を解説します。


1. CPU使用率が高いVMを移行するスクリプト

CPU使用率が 80%以上 のVMを検出し、負荷の低いホストに移行するスクリプトを作成します。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# クラスター内のホストを取得
$cluster = Get-Cluster "<cluster-name>"
$hosts = Get-VMHost -Location $cluster

# 負荷の高いVMを検索(CPU使用率80%以上)
$highLoadVMs = Get-VM | Where-Object { $_.CpuUsageMhz -gt ($_.ExtensionData.Summary.QuickStats.OverallCpuUsage * 0.8) }

# 負荷の低いホストを特定
$lowLoadHost = $hosts | Sort-Object -Property CpuUsage -Ascending | Select-Object -First 1

# 負荷の高いVMを低負荷ホストへ移行
foreach ($vm in $highLoadVMs) {
    Write-Host "Moving high-load VM: $($vm.Name) to host: $($lowLoadHost.Name)"

    # VMを移行(vMotion)
    Move-VM -VM $vm -Destination $lowLoadHost -Confirm:$false
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトのポイント

  • Get-VM コマンドを使用して、CPU使用率が 80%以上 のVMを取得
  • Get-VMHost で CPU負荷が最も低いホスト を特定し、移行先に設定
  • Move-VM で 負荷の高いVMを低負荷ホストへ移行

2. 特定のタグが付いたVMのみを移行するスクリプト

特定の用途のVM(例えば「高負荷処理」タグが付与されたVM)だけを移行する場合、以下のようなスクリプトを作成できます。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# タグが "HighLoad" のVMを取得
$taggedVMs = Get-VM | Where-Object { (Get-TagAssignment $_).Tag -eq "HighLoad" }

# 負荷の低いホストを取得
$lowLoadHost = Get-VMHost | Sort-Object -Property CpuUsage -Ascending | Select-Object -First 1

# タグが付いたVMを低負荷ホストへ移行
foreach ($vm in $taggedVMs) {
    Write-Host "Moving tagged VM: $($vm.Name) to host: $($lowLoadHost.Name)"

    # VMを移行(vMotion)
    Move-VM -VM $vm -Destination $lowLoadHost -Confirm:$false
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトのポイント

  • Get-TagAssignment を使用して、タグ 「HighLoad」 が付いているVMを抽出
  • Move-VM を使用して 指定タグが付いたVMのみ移行

3. メモリ使用率が高いVMを移行するスクリプト

CPUだけでなく、メモリ使用率 を考慮したVM移行も重要です。以下のスクリプトでは、メモリ使用率が 75%以上 のVMを自動的に移行します。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# クラスター内のホストを取得
$cluster = Get-Cluster "<cluster-name>"
$hosts = Get-VMHost -Location $cluster

# 負荷の高いVMを検索(メモリ使用率75%以上)
$highMemVMs = Get-VM | Where-Object { $_.MemoryUsageGB -gt ($_.ExtensionData.Summary.QuickStats.GuestMemoryUsage * 0.75) }

# 負荷の低いホストを特定
$lowLoadHost = $hosts | Sort-Object -Property MemoryUsage -Ascending | Select-Object -First 1

# 負荷の高いVMを低負荷ホストへ移行
foreach ($vm in $highMemVMs) {
    Write-Host "Moving high-memory VM: $($vm.Name) to host: $($lowLoadHost.Name)"

    # VMを移行(vMotion)
    Move-VM -VM $vm -Destination $lowLoadHost -Confirm:$false
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトのポイント

  • MemoryUsageGB を取得し、メモリ使用率が75%以上のVMを抽出
  • Get-VMHost で メモリ負荷が低いホストを移行先として選定
  • Move-VM で 対象VMを低負荷ホストへ移行

4. 特定の時間帯にVMを移行するスクリプト

業務時間外(例えば 23:00~04:00)の間に、VMを負荷分散するスクリプトを作成することも可能です。

# vCenterに接続
$cred = Get-Credential
Connect-VIServer -Server "<vcenter-server>" -Credential $cred

# 現在の時刻を取得
$currentHour = (Get-Date).Hour

# 業務時間外(23:00~04:00)の場合のみ実行
if ($currentHour -ge 23 -or $currentHour -lt 4) {
    # 負荷の高いホストのVMを取得
    $highLoadVMs = Get-VM | Where-Object { $_.CpuUsageMhz -gt ($_.ExtensionData.Summary.QuickStats.OverallCpuUsage * 0.8) }

    # 負荷の低いホストを特定
    $lowLoadHost = Get-VMHost | Sort-Object -Property CpuUsage -Ascending | Select-Object -First 1

    foreach ($vm in $highLoadVMs) {
        Write-Host "Moving VM: $($vm.Name) to host: $($lowLoadHost.Name)"

        # VMを移行
        Move-VM -VM $vm -Destination $lowLoadHost -Confirm:$false
    }
} else {
    Write-Host "業務時間中のため、移行をスキップしました。"
}

# vCenterから切断
Disconnect-VIServer -Confirm:$false

このスクリプトのポイント

  • Get-Date で現在の時刻を取得し、23:00~04:00のみ移行を実行
  • 業務時間中は移行をスキップ する

まとめ

  • CPU負荷やメモリ使用率に応じてVMを自動移行 できる
  • 特定のタグが付いたVMだけを選択的に移行 できる
  • 業務時間外にのみVMを移行することで、パフォーマンスへの影響を抑えられる

次の章では、PowerShellを使ったVM移行と負荷分散のまとめ を行います。

まとめ

本記事では、PowerShell(PowerCLI)を活用してvCenterのクラスター間でVMを移行し、負荷分散を最適化する方法 について詳しく解説しました。以下の重要なポイントを振り返ります。

1. PowerCLIを使用したvCenter管理の基礎

  • PowerCLIをインストールし、vCenterに接続する方法を学びました。
  • Move-VM コマンドを活用して、手動またはスクリプトによるVMの移行が可能であることを確認しました。

2. 負荷分散の最適化

  • CPUやメモリの使用率を分析し、リソースの偏りを自動で修正するスクリプトを実装しました。
  • 負荷の高いホストにあるVMを、負荷の低いホストへ自動的に移行 する方法を紹介しました。

3. エラーハンドリングと自動化の手法

  • Try-Catchを用いたエラーハンドリング により、スクリプト実行中のエラーに対応できるようにしました。
  • Windowsのタスクスケジューラを使用して、スクリプトを定期的に実行 し、負荷分散を自動化する方法を学びました。

4. 応用スクリプトの活用

  • CPU・メモリの閾値を超えた場合にVMを移行するスクリプト
  • 特定のタグが付いたVMのみを移行するスクリプト
  • 業務時間外にのみ負荷分散を実行するスクリプト

これらの手法を活用することで、仮想環境の負荷を最適に分散し、システムの安定性とパフォーマンスを向上 させることができます。


今後の展開

  • さらに高度な自動化
  • AIや機械学習を活用し、リアルタイムで最適なリソース配分を行う
  • 監視ツールとの連携
  • vRealize OperationsやZabbixと統合し、負荷状況を可視化

PowerShellを活用することで、VMware環境の管理を効率化し、運用の自動化を進めることで、管理負担を大幅に削減 できます。今後も環境に合わせたスクリプトのカスタマイズを行い、最適な負荷分散を実現していきましょう。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次