ESXi 6.7でコマンドからVMを作成

はじめに

ESXi 6.7でのVMの作成を自動化したいので、そのための手順とコマンドを調査した。

まず結論

ESXiにsshでログインして、以下のようなスクリプトを実行すればよい。

#!/bin/sh -ue

# (0) パラメータ定義
DATASTORE_PATH=/vmfs/volumes/datastore1
ISO_FILE=/vmfs/volumes/datastore1/iso/CentOS-7-x86_64-DVD-1810.iso
VM_NAME=test-vm
VM_HW_VER=vmx-09
VM_MEM_SIZE=2048
VM_NETWORK_NAME="VM Network"
VM_GUEST_OS=centos-64
VM_CDROM_DEVICETYPE=cdrom-image  # cdrom-image / atapi-cdrom
VM_DISK_SIZE=20g
VM_DISK_PATH=$DATASTORE_PATH/$VM_NAME/$VM_NAME.vmdk
VM_VMX_FILE=$DATASTORE_PATH/$VM_NAME/$VM_NAME.vmx

# (1) ダミーVMの作成
VM_ID=`vim-cmd vmsvc/createdummyvm $VM_NAME $DATASTORE_PATH $VM_HW_VER`

# (2) vmxファイルの編集
sed -i -e '/^guestOS /d' $VM_VMX_FILE
cat << __EOF__ >> $VM_VMX_FILE
guestOS = "$VM_GUEST_OS"
memSize = "$VM_MEM_SIZE"
ethernet0.present = "TRUE"                                       
ethernet0.networkName = "$VM_NETWORK_NAME"                             
ethernet0.addressType = "generated"                              
ethernet0.wakeOnPcktRcv = "FALSE"                                
ide0:0.present = "TRUE"                         
ide0:0.deviceType = "$VM_CDROM_DEVICETYPE"                                
ide0:0.fileName = "$ISO_FILE"
__EOF__

# (3) ディスク容量の拡張
vmkfstools -X $VM_DISK_SIZE $VM_DISK_PATH 

# (4) VMの情報のリロード
vim-cmd vmsvc/reload $VM_ID

以降で各ステップの説明を行う。

(0) パラメータ定義

各種パラメータを変数化しているだけ。

(1) ダミーVMの作成

コマンドvim-cmd vmsvc/createdummyvmを実行して、最小限(ですらない)ダミーのVMを作成し、それのvmxファイルを編集するという手順らしい。 ちなみに、別のコマンドであるPowerCLIにはNew-VMというコマンドレットがあり、ダミーなしで一発でVMを作成できるようだが、残念ながら無償のESXiでは利用できない。 コマンドvim-cmd vmsvc/createdummyvmの使い方は、以下のようにヘルプで確認できる。

$ vim-cmd help vmsvc/createdummyvm
Usage: createdummyvm vm_name datastore_path [hw_version]

Create a pre-configured dummy vm.

パラメータhw_versionには、コマンドvim-cmd solo/querycfgoptdescの出力のkeyの値で、なおかつcreateSupported = trueであるものを指定すればよいようだ。 例えば以下の出力結果の場合は、vmx-04とvmx-07~vmx-14が指定可能である。

$ vim-cmd solo/querycfgoptdesc
(vim.vm.ConfigOptionDescriptor) [
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-03", 
      description = "ESX 2.x virtual machine", 
      host = <unset>, 
      createSupported = false, 
      defaultConfigOption = false, 
      runSupported = false, 
      upgradeSupported = false
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-04", 
      description = "ESX 3.x virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-07", 
      description = "ESX/ESXi 4.x virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-08", 
      description = "ESXi 5.0 virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-09", 
      description = "ESXi 5.1 virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-10", 
      description = "ESXi 5.5 virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-11", 
      description = "ESXi 6.0 virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-12", 
      description = "Workstation 12 virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-13", 
      description = "ESXi 6.5 virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = false, 
      runSupported = true, 
      upgradeSupported = true
   }, 
   (vim.vm.ConfigOptionDescriptor) {
      key = "vmx-14", 
      description = "ESXi 6.7 virtual machine", 
      host = <unset>, 
      createSupported = true, 
      defaultConfigOption = true, 
      runSupported = true, 
      upgradeSupported = true
   }
]

(2) vmxファイルの編集

createdummyvmの実行で、以下の内容のvmxファイルが生成された。

これに対して、ゲストOSとメモリサイズを指定し、NICとCD-ROMドライブを追加。 vmxファイルを編集するためのコマンドはないようなので、 直接編集する。

(3) ディスク容量の拡張

ダミーVMのハードディスクの容量は1MBのサイズしかないので、20GBに拡張しておく。

(4) VMの情報のリロード

vmxファイルを編集したり、ディスクを拡張したりしても、ESXiが保持している管理情報は元のままになっている。 そのため、コマンドvim-cmd vmsvc/reloadを利用して管理情報をリロード(更新)しておく。