管理人は業務で数百にも及ぶVMを日常的に運用していますが、最近Vappの便利さに気がついて積極的に利用しています。Vappのいいところは、Vapp単位でVM群の起動や停止の制御が可能で、かつ起動順番の設定や条件をVapp単位である程度細かく設定できるところです。また、基本的に作成したVMが階層なしでフラットな構成になるvCenter Serverにおいて、擬似的にフォルダのように利用できるのもいいところです。
しかし、本格的にScrap & Buildした結果、結果的に中身が空のVappが散見される状況になってしまいました。本稿で紹介するスクリプトはこの状況の改善を目的に作成したものですが、同じような悩みを持っている方がいらっしゃったら参考にして頂ければ幸いです。
PowerCLIでvCenterへの接続は完了しているという前提で、本体になる部分だけを書きます。
# 削除対象のVappを格納するための配列を準備する
$EmptyVappList = @()
# 空のVappを$EmptyVappListに格納する
$TargetVapplist = Get-Vapp | Get-View
foreach ($IsEmptyVapp in $TargetVappList) {
if ($IsEmptyVapp.VM.Count -eq 0) {
$EmptyVappList += $IsEmptyVapp.Name
}
}
# 削除対象のVappのリストと数を表示する
Write-Output $EmptyVappList
$TargetVappCount = $EmptyVappList.Count
Write-Output "対象Vpp数 = $TargetVappCount"
# 削除の可否を問い, yかnが入力されるまで待つ
do {
$res = Read-Host "これらのVppを削除しますか?(y/n)"
}
while ($res -ne "y" -And $res -ne "n")
# nだったらその場で終了, yだったら実際に削除処理を行う
if ($res -eq "n"){
Write-Output "終了します..."
Exit
} elseif ($res -eq "y") {
Write-Output 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Write-Output "指定したVappを削除しています..."
foreach($EmptyVapp in $EmptyVappList){
Remove-Vapp -VApp $EmptyVapp -DeleteFromDisk -Confirm:$False
}
Write-Output 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Write-Output "指定したVappの削除が終了しました."
}
以上です。簡単ですね。
対象となるオブジェクトを正規表現などで絞り込むことができるような命名規則にしておくなど、一定の準備さえしてあれば、ほとんどの単純作業は短いスクリプトで実行することができるようになります。