VMware ESX仮想マシンをコマンドで操作

自宅ではESXを使っています。
デスクトップはMacを使っているのですが、MacではvSphere Clientが使えず、仮想マシンの起動・停止のためだけにWindowsマシンを使うのも面倒なので、コマンドで操作する方法を調べてみたのでメモ。

SSHでESXにログインできることが前提です。


# ESXで使えるコマンド

- vim-cmd: いろいろできるコマンド。基本的な操作はこれを使えばよさそう。
- esxcli: ネットワークやホストの操作が可能
- vmkfstools: vmdk等のディスクイメージ操作


# vim-cmdコマンド

## コマンド体系

以下のように、操作する対象によってグループがわかれているようです。

```
~ # vim-cmd
Commands available under /:
hbrsvc/       internalsvc/  solo/         vmsvc/
hostsvc/      proxysvc/     vimsvc/       help
```


## コマンドの実行方法

グループとコマンドを以下のように指定して実行

```
~ # vim-cmd vmsvc/getallvms
```


## `vim-cmd vmsvc/xxx` で使えるコマンドの一覧

VMの操作はvmsvc以下のコマンドで実行できます。だいたい名前を見れば分かりそうです。

```
~ # vim-cmd vmsvc
Commands available under vmsvc/:
acquiremksticket                 get.snapshotinfo
acquireticket                    get.spaceNeededForConsolidation
connect                          get.summary
convert.toTemplate               get.tasklist
convert.toVm                     getallvms
createdummyvm                    gethostconstraints
destroy                          login
device.connection                logout
device.connusbdev                message
device.disconnusbdev             power.getstate
device.diskadd                   power.hibernate
device.diskaddexisting           power.off
device.diskremove                power.on
device.getdevices                power.reboot
device.toolsSyncSet              power.reset
device.vmiadd                    power.shutdown
device.vmiremove                 power.suspend
devices.createnic                power.suspendResume
disconnect                       queryftcompat
get.capability                   reload
get.config                       setscreenres
get.config.cpuidmask             snapshot.create
get.configoption                 snapshot.dumpoption
get.datastores                   snapshot.get
get.disabledmethods              snapshot.remove
get.environment                  snapshot.removeall
get.filelayout                   snapshot.revert
get.filelayoutex                 snapshot.setoption
get.guest                        tools.cancelinstall
get.guestheartbeatStatus         tools.install
get.managedentitystatus          tools.upgrade
get.networks                     unregister
get.runtime                      upgrade
```



## コマンドのヘルプ

以下のようにしてヘルプを参照できます。

```
~ # vim-cmd help vmsvc/getallvms
Usage: getallvms
```
```
~ # vim-cmd help vmsvc/power.on
Usage: power.on vmid

Power on the specified virtual machine.
```





## コマンドの実行例

VM操作のコマンド実行の流れは

1. vmsvc/getallvm で vmidを取得 
1. vmidを指定して各種操作を実行 


### VMの一覧取得

```
~ # vim-cmd vmsvc/getallvm
```

こんな感じででてきます。

```
~ # vim-cmd vmsvc/getallvms
Vmid             Name                                            File                                        Guest OS          Version                  Annotation
1008   vCenter Server Appliance   [datastore1] vCenter Server Appliance/vCenter Server Appliance.vmx   sles11_64Guest          vmx-07    VMware vCenter Server Appliance
1009   Windows 8.1 (x64)          [datastore1] Windows 8.1 (x64)/Windows 8.1 (x64).vmx                 windows8_64Guest        vmx-08
1012   NetScaler vpx01            [datastore1] NetScaler vpx01/NetScaler vpx01.vmx                     solaris10_64Guest       vmx-07
944    RHEL6.1                    [datastore1] RHEL6.1/RHEL6.1.vmx                                     rhel6_64Guest           vmx-07
```


### VMの起動

vmid 944を指定してRHEL6.1を起動

```
~ # vim-cmd vmsvc/power.on 944
Powering on VM:
```

### 電源状態の確認

電源ONされたことを確認

```
~ # vim-cmd vmsvc/power.getstate 944
Retrieved runtime info
Powered on
```

### ステータスや設定情報の確認

以下のコマンドでステータスや設定が確認できます。

```
~ # vim-cmd vmsvc/get.summary vmid
```

以下のように、かなり詳細な情報が確認できます。

```
~ # vim-cmd vmsvc/get.summary 944
Listsummary:

(vim.vm.Summary) {
   dynamicType = <unset>,
   vm = 'vim.VirtualMachine:944',
   runtime = (vim.vm.RuntimeInfo) {
      dynamicType = <unset>,
      device = (vim.vm.DeviceRuntimeInfo) [
         (vim.vm.DeviceRuntimeInfo) {
            dynamicType = <unset>,
            runtimeState = (vim.vm.DeviceRuntimeInfo.VirtualEthernetCardRuntimeState) {
               dynamicType = <unset>,
               vmDirectPathGen2Active = false,
               vmDirectPathGen2InactiveReasonOther = (string) [
                  "vmNptIncompatibleNetwork"
               ],
               vmDirectPathGen2InactiveReasonExtended = <unset>,
            },
            key = 4000,
         }
      ],
      host = 'vim.HostSystem:ha-host',
      connectionState = "connected",
      powerState = "poweredOn",
      faultToleranceState = "notConfigured",
      dasVmProtection = (vim.vm.RuntimeInfo.DasProtectionState) null,
...

```

# esxcliコマンド

### ESXホストのシャットダウン


```bash
# いきなりはshutdownできない
~ # esxcli system shutdown poweroff -r maintenance
System is not in maintenance mode. Cannot perform requested operation.

# まずはmaintanance modeにする
~ # esxcli system maintenanceMode get
Disables
~ # esxcli system maintenanceMode set --timeout 0 --enable yes
~ # esxcli system maintenanceMode get
Enabled

# esxcliからシャットダウン。poweroffかrebootが可能
~ # esxcli system shutdown --help
Usage: esxcli system shutdown {cmd} [cmd options]

Available Commands:
  poweroff              Power off the system. The host must be in maintenance mode.
  reboot                Reboot the system. The host must be in maintenance mode.

# -rオプションで理由の指定が必須
~ # esxcli system shutdown poweroff --help
Usage: esxcli system shutdown poweroff [cmd options]

Description:
  poweroff              Power off the system. The host must be in maintenance mode.

Cmd options:
  -d|--delay=<long>     Delay interval in seconds
  -r|--reason=<str>     Reason for performing the operation (required)

# poweroff 実行  
~ # esxcli system shutdown poweroff -r maintenance

```


一連のコマンド

```
esxcli system maintenanceMode get
esxcli system maintenanceMode set --timeout 0 --enable yes
esxcli system maintenanceMode get
esxcli system shutdown poweroff -r maintenance
```

# 参考

かなりよくまとまった記事がいくつかあるので、あとはこちらを見れば大抵のことはできそう。

- [VMware ESXiをSSHでがんばるぞい(コマンドライン操作色々) - Qiita](http://qiita.com/binzume/items/096ce77f73b6e853c342)
- [VMware ESXi vim-cmd Command: A Quick Tutorial | DoubleCloud => Private Cloud + Public Cloud](http://www.doublecloud.org/2013/11/vmware-esxi-vim-cmd-command-a-quick-tutorial/)
- [VMware KB: Performing common virtual machine-related tasks with command-line utilities](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2012964)
- [VMware KB: Powering on a virtual machine from the command line when the host cannot be managed using vSphere Client](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1038043)