tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShellでPowerCLIを使ってVM ESX (vSphere)をコンソール管理する

仕事でVM-ESX Clientで接続してーとかやっていると、まとめて処理したい!リソース内の現在のイメージの起動状況を一覧で知りたい!などができなくて残念になります。 そんな時、VMware社がリリースしているVM ESXi(vSphere)管理用PowerShellモジュール「PowerCLI」を使えばいい感じに接続ができます。 ということで、今回はPowerCLIのご紹介です。

PowerCLI概要

素敵ですね!
VMware vSphere™ PowerCLI vSphere PowerCLI: Windows PowerShell interface for managing vSphere VMware vSphere PowerCLI is a powerful command-line tool that lets you automate all aspects of vSphere management, including network, storage, VM, guest OS and more. PowerCLI is distributed as a Windows PowerShell snapin, and includes over 370 PowerShell cmdlets for managing and automating vSphere and vCloud, along with documentation and samples.
PowerCLI Japan PowerCLI Japan2

ダウンロード

ダウンロードは、VMware社ホームページからどうぞ。
VMware vSphere™ PowerCLI vSphere PowerCLI: Windows PowerShell interface for managing vSphere
16/Mar/2013現在の最新バージョンは、5.1.0 Release 2です。 DownloadPowerCLI My VMware Accountでログインしていれば、Downloadをクリックすることで無償でダウンロードできます。 PowerCLI Login

インストール

ダウンロードすることで、.exe形式のインストーラが手に入ります。 Step1. インストーラを実行します。 PowerCLIInstall Step2. VMware VIXコンポーネントが必要と言われますが、PowerCLIインストール時に自動的にインストールされます。OKを選択します。 PowerCLI VIX Step3. インストール画面が起動するのでNextを選択 PowerCLI Install3 Step4. Nextを選択します。 PowerCLI Patent Step5. Licenseをacceptして、Nextを選択します。 PowerCLI Lisence Step6. インストールするコンポーネントを選びNextを選択します。ESXiだけならvSphere PowerCLIのみで問題ありません。 PowerCLI Compornent Step7. インストールが始まります。 PowerCLI Installing Step8. インストール完了で! PowerCLI Complete Step9. ショートカットの生成 I. デスクトップに次の名称でショートアイコンができます。
VMware vSphere PowerCLI (32-Bit)
VMware vSphere PowerCLI
II. スタートメニュー | VMware | VMware vSphere PowerCLI フォルダができてユーザーガイドやPowerCLIショートカットができます。

PowerCLI Moduleをインポートする

さて、実はただ単にPowerCLIのショートカットを実行しても起動に失敗します…。 これは、Spaninのインポートをショートカット引数に充ててるのですが、記述が誤っているためです。 また、PowerCLI が PowerShell Consoleでは起動できてもISEでは起動できません。 そこで、PowerISEでPowerCLI Snapinをインポートできないか見てみましょう。 Add-PSSnapinが正常に動作できていません。 また、動作やコマンドレットのインポート自体は、Import-ModuleでのInitialize-powerCLIEnvironment.ps1で完了します。 よって、自作PowerCLI用.ps1に次の行を追加します。
#Add-PSSnapin "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\vim.psc1"
Import-Module "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1"
これで、PowerShellシェルホスト画面のPS D:\>がPowerCLIに明示され、コマンドレットも利用できるようになります。

vSphereに接続する

さっそく、接続しましょう。 簡単です。ConnectVIServerコマンドレットを利用します。
# Connect to VM ESXi
Connect-VIServer -Server "IP or DNSname"
するとユーザークレデンシャルが聞かれますので、管理ユーザーでログインします。 PowerCLU Login 簡単ですね!

vSphereから切断する

Disconnect-VIServerを利用します。
# Disconnect VM ESXi
Disconnect-VIServer

vSphereのVMリストを取得する

Get-VMを利用します。
# List VM
Get-VM | Format-Table -AutoSize

vSphereのVMリストをResourcePoolでグルーピング

パイプかますだけです。
# Group VM by resourcePool Property
$VMResouece = Get-VM | group resourcePool

Resource Poolの一覧取得

コマンドレットでできます。
# List ResourcePool
Get-ResourcePool | Format-Table -AutoSize

VMをResource Pool毎に並び替えて取得

単純にResource Poolでsortして、必要なカラムをselectで取得しています。
# Get-VM Sort by ResourcePool
Get-VM `
    | sort ResourcePool `
    | select ResourcePool, Name, PowerState, "Num CPUs", MemoryGB `
    | Format-Table -AutoSize

決まったVMを起動する

簡単なファンクションを書いてみました。
function Start-DefaultVM{

    [CmdletBinding()]
    param(
    $defaultVM = (, (
        "VM1",
        "VM2",
        "VM3"
        ))
    )

    begin{
    }

    process{
        $defaultVM `
            | %{Get-VM -Name $_ } `
            | %{Start-VM -VM $_.Name -RunAsync -Confirm}

    }

    end{

        # Confirm all VM States been stopped
        if ($null -eq (Get-VM | ? PowerState -eq PoweredON))
        {
            "None of Virtual Machine are running!!"
        }
        else
        {
            "Now below Virtual Machine are running."
            Get-VM `
                | ? PowerState -eq PoweredON `
                | sort ResourcePool `
                | select ResourcePool, Name, PowerState, "Num CPUs", MemoryGB `
                | Format-Table -AutoSize
        }
    }
}
これで、functionに定めておいたVMのみ起動します。 また、起動状態も最後にホスト画面にだしてくれます。
Start-DefaultVM

全VMを強制的に停止させる

本来はOSからシャットダウンすべきですが参考程度に 簡単なファンクションを書いてみました。
function Stop-AllVM{

    [CmdletBinding()]
    param(
    )

    begin{
    }

    process{
        # Stop All VM Running on with Confirm
        Get-VM `
            | ? PowerState -eq PoweredOn `
            | %{Stop-VM -RunAsync $_ -Confirm}
        
    }

    end{

        # Confirm all VM States been stopped
        if ($null -eq (Get-VM | ? PowerState -eq PoweredON))
        {
            "All Virtual Machine has been stopped!!"
        }
        else
        {
            "Below Virtual Machine are still running."
            Get-VM `
                | ? PowerState -eq PoweredON `
                | sort ResourcePool `
                | select ResourcePool, Name, PowerState, "Num CPUs", MemoryGB `
                | Format-Table -AutoSize
        }
    }
}
これで、全VMが停止します。
Stop-AllVM

まとめ

vSphere ClientでのGUI管理は便利ですが面倒です……。 是非、VMインスタンスの管理はPowerCLIを使ってPowerShellで自動化しましょう。 定期作業の自動化は、興味があると共に今後も重要な位置を占めていくでしょう…!