PowerCLI で不要 VM を一括削除してみる。



  • 今回は、ラボ環境などで定期的に不要 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_list_vm.ps1 · GitHub

    Cleanup VMs

    Usage:

    PowerCLI> ./cleanup_list_vm.ps1

    $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 削除の工夫についての話でした。

    https://communities.vmware.com/people/gowatana/blog/2018/07/30/powercli-vm-delete


Log in to reply
 

© Lightnetics 2024