PowerCLI で、VM を構成するファイルの情報を取得することができます。
そして、VM の定義情報が記載されている .vmx ファイルのパスも取得できます。
ここでは、.vmx ファイルのパスを取得して
ついでにそのパスをもとに ESXi に VM の再登録をしてみます。
今回は「vm01」という名前の VM を対象とします。
vm01 という VM 名は PowerCLI で接続している vCenter のインベントリで重複しないようにしてあります。
コマンドラインで都度 VM 名を変更しなくてよいように、$vm_name という変数で扱います。
PowerCLI> $vm_name = "vm01"
あらかじめ Connect-VIServer で vCenter に接続してあります。
PowerCLI から 複数の vCenter への接続は下記のような感じになります。(古い投稿ですが)
PowerCLI から複数の vCenter に接続する方法。
VM は hv-d01.go-lab.jp という ESXi ホストでパワーオン状態です。
PowerCLI> Get-VM $vm_name | select Name,ResourcePool,Folder,VMHost,PowerState | fl
Name : vm01
ResourcePool : Resources
Folder : vm
VMHost : hv-d01.go-lab.jp
PowerState : PoweredOn
PowerCLI から見た VM のファイル。
VM のファイルは、下記のように情報を確認できます。
.vmx ファイルは Type が「config」になっています。
ちなみに、.vmx や .vmdk といった VM を構成するファイルだけでなく
VM のログファイル(vmware.log)の情報も含まれていることがわかります。
PowerCLI> (Get-VM $vm_name).ExtensionData.LayoutEx.File | select Key,Type,Size,Name | ft -AutoSize
Key Type Size Name
--- ---- ---- ----
0 config 2998 [ds-nfs-repo-01] vm01/vm01.vmx
1 nvram 8684 [ds-nfs-repo-01] vm01/vm01.nvram
2 snapshotList 0 [ds-nfs-repo-01] vm01/vm01.vmsd
3 diskDescriptor 549 [ds-nfs-repo-01] vm01/vm01_2.vmdk
4 diskExtent 1609957376 [ds-nfs-repo-01] vm01/vm01_2-flat.vmdk
5 log 231426 [ds-nfs-repo-01] vm01/vmware-1.log
6 log 233220 [ds-nfs-repo-01] vm01/vmware.log
7 swap 0 [ds-nfs-repo-01] vm01/vm01-a5ede08e.vswp
8 uwswap 0 [ds-nfs-repo-01] vm01/vmx-vm01-2783830158-1.vswp
コマンドラインを工夫すれば、複数の VM の .vmx のパスを一覧することもできます。
ホストの障害対応や、vSphere の移行作業などで VM の格納先を記録しておく際に利用できます。
PowerCLI> Get-VM test*,vm* | select Name,@{N="vmx_path";E={($_.ExtensionData.LayoutEx.File | where {$_.Type -eq "config"}).Name}} | Sort-Object Name
Name vmx_path
---- --------
test-web-01 [vsanDatastore] 532a455b-a477-02ce-4958-f44d3065d53c/test-web-01.vmx
test-web-02 [vsanDatastore] 8f2a455b-6c94-6930-3200-f44d3065d53c/test-web-02.vmx
vm01 [ds-nfs-repo-01] vm01/vm01.vmx
vm01 の .vmx ファイルのパスだけ取得して、これ以降は変数 $vmx_path で扱います。
PowerCLI> $vmx_path = (Get-VM $vm_name).ExtensionData.LayoutEx.File | where {$_.Type -eq "config"} | %{$_.Name}
PowerCLI> $vmx_path
[ds-nfs-repo-01] vm01/vm01.vmx
vCenter / ESXi への VM 再登録。
VM の再登録で、vCenter をまたいだ VM の移動をしてみます。
- 移動先の ESXi への VM 登録の際に、New-VM コマンドで .vmx ファイルのパスを指定します。
- 移動元 / 先の ESXi には、ds-nfs-repo-01 という名前で同一の NFS データストアをマウントしています。
ds-nfs-repo-01 データストアをマウントしている ESXi は、下記のように確認できます。
- ここでの「Name」は ESXi の名前です。
- 元 / 先 NFS データストアの構成確認は今回は省略して、データストア名のみをもとにしています。
- vm01 のいる hv-d01.go-lab.jp だけが独立した vCenter「vc-sv01.go-lab.jp」の ESXi 6.5 配下にいて、
それ以外の ESXi 6.7 は vCenter「infra-vc-01.go-lab.jp」の配下にいます。
PowerCLI> Get-Datastore ds-nfs-repo-01 | Get-VMHost | Sort-Object Name | select @{N="vCenter";E={$_.Uid -replace ".*@|:.
*",""}},Name,ConnectionState,Version
vCenter Name ConnectionState Version
------- ---- --------------- -------
vc-sv01.go-lab.jp hv-d01.go-lab.jp Connected 6.5.0
infra-vc-01.go-lab.jp infra-esxi-01.go-lab.jp Connected 6.7.0
infra-vc-01.go-lab.jp infra-esxi-02.go-lab.jp Connected 6.7.0
infra-vc-01.go-lab.jp infra-esxi-03.go-lab.jp Connected 6.7.0
infra-vc-01.go-lab.jp infra-esxi-04.go-lab.jp Connected 6.7.0
infra-vc-01.go-lab.jp infra-esxi-05.go-lab.jp Connected 6.7.0
infra-vc-01.go-lab.jp infra-esxi-06.go-lab.jp Connected 6.7.0
それでは vm01 を停止して、移動元 vCenter のインベントリから削除します。
VM のファイル自体を削除しないように、Remove-VM には「-DeletePermanently」を付与しないで実行ます。
PowerCLI> Get-VM $vm_name | Stop-VM -Confirm:$false
PowerCLI> Get-VM $vm_name | Remove-VM -Confirm:$false
移動先 vCenter のインベントリの ESXi のうちの 1台に(infra-esxi-06.go-lab.jp)に VM を登録します。
ついでに登録先の リソースプールと、「-Location」でVM のフォルダを指定しています
PowerCLI> New-VM -Name $vm_name -VMFilePath $vmx_path -VMHost "infra-esxi-06.go-lab.jp" -Location "lab-vms-01" -ResourcePool "rp-02-lab"
そして VM を起動します。
※VM 起動時に「コピー」と「移動」どちらかの質問メッセージがでた場合は「移動」を選択します。
PowerCLI> Get-VM $vm_name | Start-VM
これで VM の移動ができました。
PowerCLI> Get-VM $vm_name | select Name,ResourcePool,Folder,VMHost,PowerState | fl
Name : vm01
ResourcePool : rp-02-lab
Folder : lab-vms-01
VMHost : infra-esxi-06.go-lab.jp
PowerState : PoweredOn
vSphere 6.x では Cross-vCenter での vMotion も可能ですが、
実行するための前提条件で引っかかったりする場合には
このような VM の移動もできたりします。
以上、PowerCLI で .vmx ファイルの情報を取得して利用する話でした。