PowerCLI チュートリアル:VMware インフラストラクチャの管理

PowerCLI by VMWareは、ESXi対応ハードウェアのハイパーバイザー仮想化管理者の間で普及しているインタフェースになりつつあります。VMwareをPowerShellとPowerCLIを使用して管理する方法を学ぶことは、ツールキットに強力な追加です。このPowerCLIチュートリアルでは、それを実現する方法を学びます。

このチュートリアルでは、次のことを学びます:

  • PowerCLIを使用してVMwareインフラストラクチャに接続する基本
  • VMwareオブジェクトで作業するためのコマンドレットに慣れる
  • 知識を持って、探索を行う
  • PowerCLIを使ってVMwareをさらに管理する

さあ始めましょう!

必要なものと知っておくべきこと

このPowerCLIチュートリアルを進める前に、私たちが同じページにいることを確認するために重要なことがあります。この記事では、次のことを前提としています:

  • 基本的なPowerShellの経験があること。必ずしもPowerShellのエキスパートである必要はありませんが、PowerShellについての理解があると役立ちます。
  • VMware ESXiホストまたはvCenterアプライアンスがあり、接続とテストができること
  • Windows(またはMac / Linux)ワークステーションで作業していること
  • PowerCLIが既にインストールされ、接続されていること。そうでない場合は、このPowerCLIのインストール記事を参照してください。

I’ll be using PowerCLI v 11.4.0. I will be working from a Windows 10 workstation with Windows PowerShell 5.1, but you’re welcome to use PowerShell 6 instead as there’s feature parity for this tutorial.

PowerCLIを使用してESXiホストの情報を収集する

私たちのvSphere環境の仮想レイヤーにダイブする前に、物理ハードウェアレイヤーを確認することは良いアイデアです。VMware PowerCLIは、この目的のために直接コマンドレットを提供しており、詳細な情報を収集するためのGet-VMHostというコマンドレットがあります。

vCenterサーバーまたはESXiホストに接続している間に、次のコマンドレットを実行してください。

PS51> Get-VMHost
Get-VMHost

私は2つの別々のESXiホストを管理しているvCenter Server Applianceに接続しているため、管理されているホストに関する基本的な情報が提供されます。 Get-VMHostを使用すると、仮想化ホストのハードウェア機能を確認できます。ただし、Get-VMHostはデフォルトではすべての情報を返しません。

Get-VMHostコマンドレットをFormat-Listにパイプすると、指定したホストのすべての情報についてのコンソール出力が表示されます。

Get-VMHost | Format-List

また、より具体的に選択して、作業しているVMHostオブジェクトの個々のプロパティのみを選択することもできます。たとえば:

PS51> Get-VMHost | format-list -Property State,LicenseKey,Version

このより詳細な出力を活用すると、仮想化されたワークロードを実行する基盤となるハードウェアのさらなるビューが提供されます。特に、次のような情報が含まれます:

  • ライセンスの検証情報
  • CPU/Memoryの合計
  • ハードウェアベンダーモデル
  • DNSホスト名

確認後、これらの情報は、おそらくExport-CSVコマンドレットを使用してCSVファイルにまとめることができます。

PowerCLIを使用してVMを検査する

さあ、このPowerCLIチュートリアルの別のトピックについて掘り下げてみましょう。指定されたESXiホスト上に現在存在する仮想マシンを確認するためには、仮想ホストを確認することができます。

仮想マシンの情報を確認するために使用できる便利なコマンドはGet-VMです。

PS51> Get-VMHost -Name <Host FQDN> | Get-VM

このコマンドレットの出力は以下のようになります:

PS51> Get-VMHost -Name | Get-VM

上記の出力は、指定したホスト上で現在実行中のVMの完全なステータスリストを提供します。上記のように個々のホストを指定しない場合、各ホストとその上のVMの情報のテーブルが表示されます。

いつか問題のトラブルシューティングを行い、特定のホスト上の仮想マシンの数を知る必要がある場合や、VMware PowerCLIを使用してESXiホストの情報を収集する必要がある場合は、これらのコマンドレットを使用できます。利用できるレポート機能はますます拡大しています!

PowerCLIを使用して仮想スイッチを検査する

vCenterクラスタの仮想ネットワークを設定または管理する責任を負っている方々にとって、あらゆるユースケースに対応したネットワーキングコマンドレットの完全な範囲があります。vSphere環境で構成されている仮想スイッチを表示するには、以下を使用します:

PS51> Get-VirtualSwitch

仮想ネットワークや仮想スイッチの数によっては、表示されるリストが非常に大きくなる場合があります。以下の例では、DSwitchという1つのDistributed Virtual Switchが表示されています。

多くのESXiホストがクラスタ内にあるEnterprise vSphereの実装では、DSwitchesを使用することで、同じ構成を持つ複数のホスト間で仮想スイッチとポートグループの展開を簡素化することができます。これにより、各ホストで手動で同じネットワーク構成を作成する手間が省け、クラスタをスケーリングするための素晴らしい方法となります!

Get-VirtualSwitch

PowerCLIを使用して仮想ネットワークに接続されたVMを特定する

問題の範囲を絞り込もうとする際、どのVMがどのネットワークに接続されているか知りたいことがあります。そのためには、Get-VirtualPortGroupコマンドを使用することができます。このPowerCLIチュートリアルでこのコマンドレットについて学びましょう。

A port group is essentially a virtual network. To display all port groups, run Get-VirtualPortGroup without any parameters. You should then see a listing of all virtual port groups present in your vSphere environment.

Get-VirtualPortGroup

そのポートグループ内のすべてのVM(私の場合はDPortGroup)を見つけるには、以下のスクリプトを実行します。値DPortGroupをご自身の仮想ポートグループの名前に置き換えてください。

PS51> Get-VM | Where-Object { ($PSItem | Get-NetworkAdapter | where {$_.networkname -match "DPortgroup"})}

このワンライナーでは、このvCenterアプライアンスに存在するすべての仮想マシンのリストを取得し、Where-Objectコマンドレットでネットワーク名がポートグループに一致するVMのみを取得しています。

Getting VMs with only a specific port group

この出力を使用することで、各ネットワークに接続され、設定されたマシンを定義することができます。

VMwareで特定のネットワークに接続されているVMを特定し、分析するよう求められた場合、このPowerCLIのレポートソリューションを提供することができるようになります。

PowerCLIを使用してVMのOSバージョン情報を取得する

VMwareの管理作業の大部分は、仮想マシンのレベルで行われます。おそらく、VM上のすべてのハードドライブサイズのリストの取得や、サーバーのゲストOSバージョンの取得などのタスクに関する無数のリクエストを受けるでしょう。

これらのタスクは、規模が大きくなると手間がかかります。PowerCLIを使用すると、いくつかの重要なコマンドレットを追加してこのプロセスを効率化できます。そこで、このPowerCLIチュートリアルでそれらをカバーしましょう。

あなたは、「VMwareクラスターにはUbuntuサーバーが何台ありますか?」といった質問をされたことがあるかもしれません。その場合、vCenterで回答を探すために時間をかけてしまったかもしれません。PowerCLIを使用すると、vCenterのVMオブジェクトを見て、出力にいくつかのPowerShellの魔法を適用することで、このプロセスを効率化できます。

以下のスクリプトを見てみましょう。このスニペットでは、後ほど詳しく説明する「Get-View」というコマンドを使用してVMの情報を取得しています。この場合、この方法で最も簡単に取得できるネストされたプロパティを収集しています。

PS51> Get-VM | 
      Sort-Object -Property Name |
      Get-View -Property @("Name", "Config.GuestFullName", "Guest.GuestFullName") |
      Select-Object -Property Name, @{N="Configured OS";E={$_.Config.GuestFullName}}, @{N="Running OS";E={$_.Guest.GuestFullName}}

上記のコードは、PowerCLIの「Get-VM」コマンドを使用して仮想マシンのリストを取得し、PowerShellの「Sort-Object」コマンドを使用してそのリストをソートし、PowerCLIの「Get-View」コマンドを使用してオブジェクトのいくつかのプロパティを取得しています。

私の環境でこれを実行すると、以下の結果が得られます。vCenterのVMの名前、VMwareの仮想ハードウェアがゲストオペレーティングシステムを解釈する方法である「Configured OS」、および実際のOSを表す「Running OS」が表示されています。

Finding VMs based on various criteria

ReplicantScriptrunnerの仮想マシンがクラスターで停止している場合、それらのための実行中のOSの値は表示されません。OSはVMware Toolsサービスによって収集されます。利用できない場合、PowerCLIはオペレーティングシステムの情報を取得できません。

PowerCLIを使用してCSVレポートを作成する

VMware Toolsは、WindowsおよびLinuxのVMに対してハイパーバイザーに追加の情報と管理機能を提供するゲスト内サービスです。最も一般的には、クリーンシャットダウン、オペレーティングシステムの情報、およびVMの高解像度コンソール表示が提供されます。

A convenient way to report on and provide this information would be to pipe the above script into the Export-CSV  cmdlet. Export-Csv will create a CSV file with the same information you see in the console.

PS51> Get-VM | Sort-Object -Property Name | Get-View -Property @("Name", "Config.GuestFullName", "Guest.GuestFullName") |
Select -Property Name, @{N="Configured OS";E={$_.Config.GuestFullName}}, @{N="Running OS";E={$_.Guest.GuestFullName}} | Export-CSV C:\report.csv -NoTypeInformation 

上記のコードを実行した後、ExcelでCSVファイルを開いてレポートを確認できるはずです。

CSV file of VM information

PowerCLIを使用して仮想ハードディスクを検査する

Get-Harddiskコマンドも便利なコマンドです。 Get-HardDiskコマンドレットを使用すると、VMに接続された仮想ハードディスクに関する情報を調査できます。

たとえば、exchange1 VMに接続された仮想ハードディスクの情報をクエリするには、次のコマンドを実行できます:

PS51> Get-VM -Name exchange1 | Get-HardDisk | Format-List
Querying information about the virtual hard disk attached to the exchange1 VMs

一部の情報は冗長である場合があります(KB vs. GBでの容量など)。しかし、StorageFormat(シンまたは厚いプロビジョニングタイプ)やVMDKファイル名を知ることには価値があります。

たとえば、共通の問題があり、すべてのVMハードディスクが同じデータストアボリュームに存在する場合、この知識はトラブルシューティングを迅速化するかもしれません。

PowerCLIを使用して仮想ネットワークアダプタを検査する

仮想マシンのハードディスク情報を確認するだけでなく、仮想ネットワークアダプタもチェックしたい場合があります。単一のVMのプロパティを確認するには、Get-NetworkAdapterコマンドレットを使用します。

PS51> Get-NetworkAdapter -VM myVM

以前に、同じネットワークに存在するすべてのVMを検索したことがありましたが、今回は特定のVMに接続されたアダプタのみを表示したいと思います。

Get-NetworkAdapter

これは、複数のネットワークアダプタに接続されたVMのトラブルシューティングに役立ちます。適切なネットワークに接続されているかを一目で確認することができます。

Invoke-VMScriptを使用してVM内でPowerShellスクリプトを実行する

Invoke-VMScriptを使用すると、VM内で直接PowerShellコードを実行することができます。ネットワーク接続は必要ありません。Hyper-V環境内でPowerShell Directを使用したことがある場合は、同様の体験になります。

通常のWinRMやSSH接続なしで、Invoke-VMScriptコマンドレットを使用してコマンドをVMに直接送信できます。

例えば、exchange1という名前のVMでシンプルなディレクトリリストを実行したい場合、以下のようにScriptTextパラメータの値にdir C:\を渡します。

PS51> Invoke-VMScript -VM exchange1 -ScriptText "dir C:\"

結果は、VMコンソール自体からコマンドを実行したかのようです。Invoke-VMScriptは、実行されたコマンドが返すすべての出力を転送します。

Invoke-VMScript

これは基本的な例ですが、複雑にすることもできます。このPowerCLIのコマンドレットでは、ScriptTextパラメータ内でバッチ、PowerShell、またはBashのタイプを指定できます。

さらに高度な方法もあります。以下では、ScriptTextパラメータの入力に別の$script変数を使用してPowerShellコードを実行する方法を示しています。これにより、よりカスタマイズされたスクリプト入力を作成できます。

PS51> $script = 'Get-Disk'

$guestCredential = Get-Credential

Invoke-VMScript -ScriptText $script -VM VM -GuestCredential $guestCredential  -ScriptType Powershell

ScriptTextパラメータの値は文字列である必要があります。これが$script変数に単一の外側引用符が必要な理由です。

GuestCredentialパラメータの使用にも気付いたかもしれません。このパラメータは、VMのオペレーティングシステムに認証するために使用されます。このパラメータは、スクリプトを別のアカウントで実行したい場合に特に便利です。

スクリプトの実行結果は、以下のような出力を提供します。

Running a script on a VM with Invoke-VMScript

このスクリプトの結果により、VMのディスク情報を取得できます。その結果、VMware Virtual Diskがドライブのフレンドリー名として表示されるため、リモートVMであることがわかります。

Get-Viewを使った高度な操作

基本的なcmdletのいくつかで、ExtensionDataというプロパティが返されることがあるかもしれません。PowerCLIの多くのcmdletをPowerShellのGet-Member cmdletにパイプすることで、このプロパティを見つけることができます。

このプロパティについて疑問がある場合は、これが何であるかを知るチャンスです。

次のステップは、Get-View cmdletを理解することです。VMware PowerCLIでは、Get-VMの綺麗でシンプルな出力を提供するために、VMに対してさまざまなクエリを使用しています。しかし、Get-View cmdletを使用しないとアクセスできない裏側にはたくさんの情報があります。この例では、仮想マシンの情報(exchange1)を取得するために、Get-View cmdletを使用してみてください。

Filterオプションを使うときには、PowerShellのハッシュテーブルを使用する必要があり、個々の文字列値では使えないことに注意してください。独自のスクリプトを作成する際には注意してください。

PS51> Get-View -ViewType VirtualMachine -Filter @{"Name" = "myVMName"}

上記のコマンドの結果は、ネストされた設定情報やVMに対してアクションを実行したりオブジェクトのプロパティを取得するためのメソッドオプションがたくさん表示されます。

Get-View

同じスクリプトを使用して出力を変数に送ると、ドット記法を使用してそれらのネストされたオプションを調べることができます。ここでは、PowerCLIを介してレポートしたいゲストオペレーティングシステムの追加情報を表示および取得することができます。

PS51> $VM = Get-View -ViewType VirtualMachine -Filter @{"Name" = "myVMName"}
PS51> $VM.Guest
Using Get-View with the Filter Parameter

単一のプロパティを選択したい場合は、次のコマンドを実行して個別の値を絞り込むことができます。

PS51> $VM.Guest.GuestFullName

あらゆるタイプのVMwareオブジェクトには、多くのGet-Viewオプションがあります。これらのオプションをすべて探索し、この強力なcmdletについて詳しく説明したVMwareの情報記事をご覧ください。

VMware Code Capture – クリックから学ぶ

PowerCLIを活用したいが、コードを入力して作成することは避けたい場合は、vCenterのCode Captureをご利用ください。Code Captureは、Active Directory管理センターと同様に機能する新しい開発者ツールです。このPowerCLIチュートリアルでは、Code Captureについて説明します。

このツールは、GUIで実行するすべての操作を記録し、それらの操作をPowerCLIスクリプトとして提供します。

デフォルトでは、Code Captureはオフになっています。オンにするには、vCenterアプライアンスを開き、以下に示すようにメニュー -> 開発者センターに移動します。

Navigating to the Developer Center menu item in vSphere

開発者センタータブに移動すると、Code Captureを有効にするオプションを切り替えることができます。

Enabling code capture

Code Captureを有効にすると、vCenterヘッダーに赤いRecordボタンが表示されます。有効になったら、GUIのアクティビティを記録してPowerCLIの出力に変換するために、recordボタンを押してGUIの操作を記録する必要があります。

Code capture enabled indicator

赤いrecordボタンは、vCenterのログインユーザーセクションの横に表示されるため、いつでも記録することができます。

Code Captureのデモンストレーションを行うには、New Virtual Machineの作成ウィザードを進めてください。

  1. Recordボタンをクリックして録画を開始します。これにより、赤いRecordボタンが点滅し始めます。
  2. VMwareホストを右クリックし、新しい仮想マシンを作成します。すべてのデフォルト値を使用して新しい仮想マシンを作成するウィザードを実行してください。
  3. 仮想マシンが作成されたら、録画ボタンをクリックして録画を停止します。

生成された出力は、予想よりも多少冗長になる場合があります。出力には、VMを作成するコードの開始を示すコメントで始まるセクションが含まれています。CreateVM_Task。これがコードのVM作成が始まる場所です。

以下は、Code Captureを使用してGUI経由でのNew VM WizardプロセスのCreateVM_Task出力の一部です。

Developer Center generated code

この出力は少し圧倒されるかもしれませんが、仮想マシンの構成オプションの数に直接アクセスできます。独自のニーズに応じて、スクリプトを調整してカスタマイズすることができます。

Code Captureユーティリティは、VMの作成に限定されません。ネットワーキングの変更、小規模なVMの変更、またはホストの設定変更のためのコードを作成することもできます。GUI操作のPowerCLI出力を確認できるため、インフラストラクチャをコードとして展開する旅路を短縮することができます。

PowerCLIチュートリアルの要約です。

この記事では、多くの内容をカバーしています。素晴らしい仕事です!PowerCLIがVMwareインフラストラクチャの管理にもたらすパワーを実感していただけたことを願っています。

PowerCLIにはさまざまな製品ベースのコマンドレットがありますが、ここではわずかに触れただけです。この素晴らしいツールに関するさらなる記事をお楽しみに!

さらなる参考資料

Source:
https://adamtheautomator.com/powercli-tutorial/