vSphere を PowerShell でコントロール

#自分のメモ書き用です

#Power Cmdlet Reference
https://code.vmware.com/docs/11794/cmdlet-reference


#使用した　VMware PowerCLI
VMware-PowerCLI-6.5.0-4624819.exe

参考
https://www.powershellgallery.com/packages/VMware.PowerCLI/6.5.1.5377412
https://code.vmware.com/web/tool/6.5.1/vmware-powercli
Install-Module -Name VMware.PowerCLI -RequiredVersion 6.5.1.5377412

#vSphereに接続する
<pre>
Connect-VIServer -Server vcsa.vsphere.local -Protocol https -User 'Administrator@vsphere.local' -Password 'password'
</pre>

VMware PowerCLI User's Guide P33

#VMリスト
<pre>
Get-VM

電源状態を取得
Get-VM -Name "clone-n2pc11[0-9]" | foreach { echo $_.Powerstate }
もしくは
Get-VM "clone-n2pc11[0-9]"

</pre>

#リソースプールの電源状態をファイルに記録
<pre>
$respool = Get-ResourcePool ResourcePool
Get-VM -Location $respool | Select-Object Name, PowerState > myVMProperties.txt

</pre>

#リソースプール内のVMの配列
<pre>
$vmList = Get-VM -Location $respool
$vmList[0].Name
$vmList.Count
</pre>

#OS情報
<pre>
Get-VMGuest VM | fc
</pre>

#リソースプール内のVMのIPをリスト
<pre>
$respool   = Get-ResourcePool resourcepool-name
$vmlist    = Get-VM -Location $respool
$guestlist = Get-VMGuest $vmlist
 for ($i=0; $i -lt $guestlist.count ; $i++)
 { echo $guestlist[$i].Ipaddress[0] }
</pre>


#リソースプール内のVMをすべてサスペンド
<pre>
Horizonにプールされたマシンの場合は事前にプールをDisableにしておく
$respool = Get-ResourcePool satatest
Get-VM -Location $respool | Suspend-VM -RunAsync:1 -Confirm:0
</pre>

#VMをスタート
<pre>
Get-VM VM | Start-VM
Start-VM $vm

まとめての場合：
Get-VM -Name clone[0-9][0-9] | foreach { Start-VM -VM $_ -RunAsync:1 -Confirm:0 }
</pre>

#ソフトOFF
<pre>
Stop-VMGuest VM
Get-VM -Name "clone-n2pc4[0-9][0-9]" | foreach {Stop-VMGuest -VM $_ -Confirm:0}
</pre>

#電源OFF
<pre>
Stop-VM VM
Get-VM -name "clone-n2pc4[0-9][0-9]" | foreach {Stop-VM -VM $_ -Confirm:0}
</pre>

#リソースプール内のVMを電源OFF
<pre>
$respool = Get-ResourcePool ResourcePool
Get-VM -Location $respool | Stop-VM 
</pre>

#ソフトリスタート
<pre>
ReStart-VMGuest VM -Confirm:0
</pre>

#強制リスタート
<pre>
ReStart-VM VM
</pre>

#特定の連番以上の名前のVMソフトOFF
<pre>
stop-vmguest clone-n2pc99* -Confirm:0

#801～1000までをソフトOFF
for( $i=801; $i -lt 1001; $i++){
 $vm1 = "clone-n2pc" + $i
 $vm2 = Get-VM $vm1
 if( $vm2.PowerState -eq "PoweredOn" ){
  echo $vm2.Name
  Stop-VMGuest $vm2 -Confirm:0
 }
}

#1～800までの中で電源ON/OFFの数を数える
$vmOn = @()
$vmOff = @()
for( $i=1; $i -lt 801; $i++){
 $vm1 = "clone-n2pc" + $i
 $vm2 = Get-VM $vm1
 if( $vm2.PowerState -eq "PoweredOn" ){
  echo $vm2.Name
  $vmOn += $vm2
 }else{
  echo $vm2 "   OFF"
  $vmOff += $vm2
 }
}
echo $vmOn.count
echo $vmOff.count


#1～800まで強制リスタート
for( $i=1; $i -lt 801; $i++){
 $vm1 = "clone-n2pc" + $i
 echo $vm1
 ReStart-VM $vm1 -Confirm:0
}
</pre>

#他のホストにvMotion
<pre>
Get-VM -Name clone118 | Move-vm -destination HostB.vsphere.local -RunAsync:1
</pre>

#以下は参考
<pre>
#１～200までをシャットダウン
for( $i=1; $i -lt 201; $i++){ Get-View -ViewType VirtualMachine -Filter @{"Name" = "clone-n2pc"+$i } | foreach{$_.ShutdownGuest()} }
または
for ($i=1; $i -lt 201; $i++){ $vmname = "clone-n2pc" + $i; Stop-VMGuest $vmname }

#401～1000までをシャットダウン
for( $i=401; $i -lt 1001; $i++){ Get-View -ViewType VirtualMachine -Filter @{"Name" = "clone-n2pc"+$i } | foreach{$_.ShutdownGuest()} }

#401～1000までをシャットダウン
for( $i=401; $i -lt 1001; $i++){ $vmname = "clone-n2pc" + $i; Stop-VM $vmname }

#1～1000の中で電源ONのものをシャットダウン
for($i=1; $i -lt 1001; $i++){
$filter = @{"Runtime.PowerState" ="poweredOn"; "Name" = "clone-n2pc" + $i}
Get-View -ViewType "VirtualMachine" -Filter $filter | foreach{$_.ShutdownGuest()}
}

for($i=1; $i -lt 1001; $i++){Get-View -ViewType "VirtualMachine" -Filter @{"Runtime.PowerState" ="poweredOn"; "Name" = "clone-n2pc" + $i} | foreach{$_.ShutdownGuest()}}

＃401～1000までの電源ONを強制OFF
for($i=401; $i -lt 1001; $i++){Get-View -ViewType "VirtualMachine" -Filter @{"Runtime.PowerState" ="poweredOn"; "Name" = "clone-n2pc" + $i} | foreach{$_.StopGuest()}}

#401～1001までの中でPowerONは強制OFF　うまくいくが、時間かかる
 for($i=401; $i -lt 1001; $i++){ $var_name = "clone-n2pc" +$i ; echo $var_name ; $var_obj = Get-VM $var_name ; if($var_obj.PowerState -eq "PoweredOn"){ echo $var_name ; Stop-VM $var_name}}
</pre>


#登録外し
<pre>
Remove-vm VM
remove-vm  "clone-n2pc99[1-9]" -Confirm:0

Diskからも削除
Remove-VM -DeletePermanently -VM vmName[0-4]
</pre>

#VMの移動
<pre>
Get-VM -Name VM -Location Host01 | Move-VM -Destination Host02
</pre>

#ESXiホストをリスト
<pre>
Get-VMHost
</pre>

#ESXiをリブート
<pre>
$vmhostView = Get-VMHost -Name Host | Get-View
$vmhostView.RebootHost()
</pre>

#ESXiホストの追加
<pre>
add-VMHost -Name Host -Location (Get-Datacenter DC) -User root -Password pass
</pre>

#リソースプール上のVMリスト
<pre>
Get-Resourcepool Resourcename | Get-VM
</pre>

#VMを配列に入れる
<pre>
$vmList = @()
$vmList += Get-VM VM
</pre>

#リソースプールのVMを配列に格納　
<pre>
$vmList = Get-Resourcepool Resourcename | Get-VM
echo $vmList.count
echo $vmList

#上記リソースプール内の電源ONのリスト
for( $i=0; $i -lt $vmList.count; $i++){
 if( $vmList[$i].PowerState -eq "PoweredOn"){
  $onList += $vmList[$i]
 }
}
</pre>

#Filter を使って特定のVMのシャットダウン　しかしフィルターは時間がかかる
<pre>
$filter = @{"Runtime.PowerState" ="poweredOn"; "Config.GuestFullName" = "Windows XP"}
Get-View -ViewType "VirtualMachine" -Filter $filter | foreach{$_.ShutdownGuest()}
Get-View -ViewType VirtualMachine -Filter @{"Name" = "Win-GPU"} | foreach{$_.ShutdownGuest()}
Get-View -ViewType VirtualMachine -Filter @{"Name" = "LC1"} | foreach{$_.ShutdownGuest()}
</pre>

#VM2を含むVMをリスト
<pre>
$vm2 = Get-View -ViewType VirtualMachine -Filter @{"Name" = "VM2"}
</pre>

#VMを別窓のリストから選択
<pre>
$VM = Get-VM | Out-GridView -Title "VM List" -PassThru
$VM = Get-VM | Select Name, VMHost | Out-GridView -Title "VM List" -PassThru
</pre>

#VMを動かすとき
<pre>
start-vm hci-fio-vsanDatastore-[0-3]-[1-8] -confirm:0
</pre>

#参考URL
https://code.vmware.com/web/tool/12.0.0/vmware-powercli
http://kt-hiro.hatenablog.com/entry/20121019/1350631006

https://www.vmware.com/support/pubs/
DL https://my.vmware.com/jp/web/vmware/details?downloadGroup=VS-CLI-670&productId=742
Doc https://www.vmware.com/support/pubs/ps_pubs.html
Doc https://www.vmware.com/support/developer/PowerCLI/index.html
DL Doc https://code.vmware.com/web/tool/12.0.0/vmware-powercli