読者です 読者をやめる 読者になる 読者になる

HYPERCONCERTO株式会社のチーフエンジニア雑記Blog

hyperconcerto株式会社のチーフエンジニアが日々気づいたことを書いています

3回目、vSphereをPowerShellで操作するときのTips

特定のOSを使用しているGeustOSの一覧を作りたい!

回答
EOL対応とかセキュリティ対応でいますぐ出してよ!ってよく言われるあれです。
構成管理をさぼってると非常に大変な作業でして、いちいちログインして確認するのは非現実的なので
、vCenterからGUIから確認することが多いと思います。
しかし、台数が多いと大変なので自動化してみます。
前回のGet-VMGuestコマンドで取得できますが、このコマンドはVM名を引数として渡さないと動きません。
一気に表示する場合は下記のようなコマンドになります。
※表示に時間がかかるので実行時には注意してください。

Get-VM | Get-VMGuest

さらにGet-VMGuestの中身からWhere-ObjectコマンドでWindows Server 2012に該当するものだけを抽出すると下記のようになります。

Get-VM | Get-VMGuest | Where-Object {$_.OSFullName -like "*Microsoft Windows Server 2012*"}

このコマンドだと下記の表示になってわかりにくいです。


State IPAddress OSFullName

          • --------- ----------

Running {10.0.0.1} Microsoft Windows Server 2012 (64 ビット)
Running {10.0.0.2} Microsoft Windows Server 2012 (64 ビット)
Running {10.0.0.3} Microsoft Windows Server 2012 (64 ビット)

改良したコマンド
Get-VM | Get-VMGuest | Where-Object {$_.OSFullName -like "*Microsoft Windows Server 2012*"} | SELECT VmName,HostName,IPAddress,OSFullName

VmName HostName IPAddress OSFullName

            • -------- --------- ----------

TestVM1 WINAD1 {10.0.0.1} Microsoft Window...
TestVM2 WINSRV2 {10.0.0.2} Microsoft Window...

見切れてますのできちんとした形で見る場合はCSV形式で書き出しましょう

CSV書き出しと電源状態の表示を追加したコマンド
Get-VM | Get-VMGuest | Where-Object {$_.OSFullName -like "*Microsoft Windows Server 2012*"} | SELECT VmName,HostName,IPAddress,OSFullName,State | Export-Csv C:\Temp\test.txt -Encoding Default


作成から1ヵ月以上経過しているスナップショットを持っているか調べる方法はないのでしょうか?

回答
VMware社の推奨では48時間を超えてスナップショットを保持しないでくださいというガイドラインがあります。
指定した期間を経過していたら表示するコマンドがあったら便利ですが、用意されて内容です。
しかし、PowerCLIでちょっと作りこまないと多分無理です。
ちょっと頑張って任意の日数で抽出するスクリプトを作ってみました。

※モジュールの読み込みコマンドを入れてないのでPowerCLIの窓から呼び出してください。

ShowSnapshotInfo.ps1

$VIServer = "192.168.0.1"
$UserName = "administrator@vsphere.local"
$Password = "P@ssw0rd1!"
$LimitDay = 7

$vCenter_ret = Connect-VIServer -Server $VIServer -User $UserName -Password $Password

$i = 0

$ret_get_vm = Get-VM
$LimitDay = $LimitDay * -1
$tempLimitDay = (Get-Date).AddDays($LimitDay)

foreach($temp_Results1 in $ret_get_vm){
$ret_SnapShot = Get-Snapshot -vm $temp_Results1.Name

foreach($temp_Results2 in $ret_SnapShot){
$tempSnapShotDay = $temp_Results2.Created
if ($tempSnapShotDay.Date -lt $tempLimitDay.Date){
#CSV形式へ変換
$OutString = $temp_Results1.Name + "," + $temp_Results2.Name + "," + $temp_Results2.Created
#結果出力
$OutString
}
}
}

Disconnect-VIServer -Server $VIServer -Confirm:$false


使い方
vCenterのIPアドレスや認証情報を環境に合わせて修正してください。
変数$LimitDayに対して検知したいスナップショットの古さを指定してください。
1か月の場合は下記のようになります。
$LimitDay = 30

出力はVM名、スナップショット名、スナップショット日付
となります。

スクリプトは全数に対してGet-VMを投げているのでVMの数が多い環境では非常に時間がかかります。

スクリプトに対する安全性やバグについては保証しません。