はじめに
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
を利用して管理情報をリロード(更新)しておく。