想定している読者
この記事は以下のような方を想定読者としています。
- vSphere基盤の開発/運用を行っている方
- PowerCLIの基本的な使い方を理解されている方
- イベントの期間指定エクスポートがないバージョンのvSphere基盤を利用されている方(vSphere8.0では
高度なエクスポート
という機能があり、GUIからでも時間指定でイベント抽出できるようです) - vSphereのイベントをGUIで漁るのに辟易されている方
vSphere Clientのイベントとは?
この記事で触れているイベントとは、vSphere Clientから各オブジェクト(クラスタ/ESXiホスト/VM)を選択後、監視
>タスクとイベント
>イベント
から確認できる情報を指しています。
※以下は、VMware HOL(Hands On Lab)の画面です。
なぜCSV出力したいのか
vSphere ClientのGUIで情報を確認する場合、1ページ内に表示できるイベントの上限数は100件までです。
101件より以前のイベントを確認するには、ページ送りで確認する必要があります。
障害発生の時刻がわかっていれば、その時刻まで振り返ってイベント一覧を確認したいですよね。
その場合、地獄のページ送りを連発して、対象の時刻まで移動する必要があり、非常に大変です。
PowerCLIでイベントを取得する方法
クラスタのイベントを取得する方法(標準出力)
$cluster = Get-Cluster -Name "クラスタ名"
Get-VIEvent -Entity $cluster -Start 20240401T15:50:20 -Finish 20240402T15:50:20 | ForEach-Object{"{0};{1};{2}"} -f $_.CreatedTime, $_EventTypeId, $_.FullFormattedMessage}
以下のようなエラーが出た場合は、開始時刻と終了時刻をGet-Dateを利用して変数に格納してから、オプションの引数として渡してみましょう。
Get-VIEvent: Cannot bind parameter 'Start'. Cannnot convert Value "20240401T15:50:20" to type "System.DateTime". Error: "String '20240401T15:50:20' was not recognized as a valid DateTime."
以下のように変数格納し、Get-VIEvent
に渡しましょう。
もっと美しいやり方があるような気もしますが、YYYYMMDD表記でない環境でもうまく動くので、この方法で日付を指定しています。
VMware HOL環境はMMDDYYYY表記ですが、以下の方法でちゃんと動作します。
$start = Get-Date -Year 2024 -Month 4 -Day 1 -Hour 1 -Minute 50 -Second 20
$finish = Get-Date -Year 2024 -Month 4 -Day 2 -Hour 1 -Minute 50 -Second 20
Get-VIEvent -Entity $cluster -Start $start -Finish $finish | ForEach-Object{"{0};{1};{2}"} -f $_.CreatedTime, $_EventTypeId, $_.FullFormattedMessage}
これでイベント一覧を標準出力することが可能になりました。
クラスタのイベントを取得する方法(CSV出力)
次にCSV出力をするために情報を整形します。
例として、"C\User\Administrator\result.csv"のパスにcsvを出力する場合のコマンド例を記載します。
Get-VIEvent -Entity $cluster -Start $start -Finish $finish | Select-Object @{Name="CreatedTime"; Expression={$_.CreatedTime}}, @{Name="EventTypeId"; Expression={$_.EventTypeId}}, @{Name="FullFormattedMessage"; Expression={$_.FullFormattedMessage}} | Export-Csv -Path C\User\Administrator\result.csv -NoTypeInformation -Encoding UTF8
ESXiホスト/VMのイベントを取得する方法
利用するコマンドは、クラスタと同じくGet-VIEvent
です。
Get-VIEvent
の利用方法を書くのは冗長ですので、差分だけ書きます。
ESXiホストのイベントを取得する方法
Get-VMHost
でESXiホストのエンティティを取得し、Get-VIEvent
に渡します。
$esxi = Get-VMHost -Name "ESXiホスト名"
Get-VIEvent -Entity $esxi -Start $start -Finish $finish | ForEach-Object{"{0};{1};{2}"} -f $_.CreatedTime, $_EventTypeId, $_.FullFormattedMessage}
VMのイベントを取得する方法
こちらも同じですね。
Get-VM
でESXiホストのエンティティを取得し、Get-VIEvent
に渡します。
$vm = Get-VM -Name "VM名"
Get-VIEvent -Entity $vm -Start $start -Finish $finish | ForEach-Object{"{0};{1};{2}"} -f $_.CreatedTime, $_EventTypeId, $_.FullFormattedMessage}