今回は、ラボ環境などで定期的に不要 VM を一括削除するための工夫についてです。
あらかじめ 削除禁止 VM のリスト ファイルを用意しておき、
そこに記載されていない VM を PowerCLI で一括削除してみます。
今回の PowerCLI 10.1 を利用しています。
あらかじめ vCenter に接続しておきます。
PowerCLI> Connect-VIServer <vCenter アドレス>
まず、削除したくない VM のリストファイルを作成しておきます。
PowerCLI> cat .\VM-List_HomeLab-Infra.txt
infra-backup-01
infra-dns-01
infra-dns-02
infra-jbox-02
infra-ldap-02s
infra-nsxctl-01-NSX-controller-1
infra-nsxdlr-01-0
infra-nsxesg-01-0
infra-nsxmgr-01
infra-pxe-01
infra-repo-01
infra-sddc-01
infra-vrli-01
infra-vrni-01
infra-vrni-proxy-01
infra-vrops-01
ol75-min-01
このリストファイルは、下記のように vCenter 実機の情報から
ベースとなる作成しておくと間違いが少ないかなと思います。
PowerCLI> Get-VM | Sort-Object Name | %{$_.Name} | Out-File -Encoding utf8 -FilePath .\VM-List_HomeLab-Infra.txt
今回は、下記のようなスクリプトを作成しました。
# Cleanup VMs
# Usage:
# PowerCLI> ./cleanup_list_vm.ps1 <VM_List.txt>
$vm_list_file = $args[0]
if($vm_list_file.Length -lt 1){"リストを指定して下さい。"; exit}
if((Test-Path $vm_list_file) -ne $true){"リストが見つかりません。"; exit}
$vm_name_list = gc $vm_list_file |
where {$_ -notmatch "^$|^#"} | Sort-Object | select -Unique
function step_mark {
param (
[String]$step_no,
[String]$step_message
)
""
"=" * 60
"Step $step_no $step_message"
""
}
$vms = Get-VM | sort Name
$delete_vms = @()
$vms | % {
$vm = $_
if($vm_name_list -notcontains $vm.Name){
$delete_vms += $vm
}
}
step_mark 1 "削除VM一覧"
$delete_vms | ft -AutoSize Name,PowerState,Folder,ResourcePool
$check = Read-Host "上記のVMを削除しますか? yes/No"
if($check -ne "yes"){"削除せず終了します。"; exit}
step_mark 2 "VM削除"
$delete_vms | % {
$vm = $_
if($vm.PowerState -eq "PoweredOn"){
"Stop VM:" + $vm.Name
$vm = $vm | Stop-VM -Confirm:$false
}
"Delete VM:" + $vm.Name
$vm | Remove-VM -DeletePermanently -Confirm:$false
}
下記のように削除禁止 VM のリスト ファイルを指定して、
スクリプトを実行します。
PowerCLI> .\cleanup_list_vm.ps1 .\VM-List_HomeLab-Infra.txt
============================================================
Step 1 削除VM一覧
Name PowerState Folder ResourcePool
---- ---------- ------ ------------
infra-ldap-02s_old PoweredOff 01-Infra rp-01-infra
test-ldap-01m PoweredOff test-ldap rp-02-lab
test-ldap-01s PoweredOff test-ldap rp-02-lab
test-vm-01 PoweredOn lab-vms-01 rp-02-lab
test-vm-02 PoweredOn lab-vms-01 rp-02-lab
test-vm-31 PoweredOn 02-Lab rp-02-lab
上記のVMを削除しますか? yes/No: yes
============================================================
Step 2 VM削除
Delete VM:infra-ldap-02s_old
Delete VM:test-ldap-01m
Delete VM:test-ldap-01s
Stop VM:test-vm-01
Delete VM:test-vm-01
Stop VM:test-vm-02
Delete VM:test-vm-02
Stop VM:test-vm-31
Delete VM:test-vm-31
PowerCLI>
これで、定期的なラボのクリーンアップなどが簡単になるはずです。
ただし、VM 削除は失敗すると大変なことになるので、
スクリプトは入念に例外制御や実行テストが必要かなと思います。
以上、PowerCLI での VM 削除の工夫についての話でした。