zaki work log

作業ログやら生活ログやらなんやら

[VMware] govcを使ってCLIでVMを作ったり消したりする

ESXiの無償ライセンスだとwrite系のAPIは使えないけど、評価版ラインセスなら試せるのでまとめてみた。
業務の検証環境のvCenterだとたまに使うので"カンペ"が欲しかったのです。

github.com

確認した環境

$ govc version
govc 0.22.1

環境変数設定

httpで動作してる場合GOVC_INSECUREを設定する。
GOVC_URLにはESXiのアドレスを設定。

アカウントは操作可能な権限を与えられているユーザを指定する。

export GOVC_INSECURE="1"
export GOVC_USERNAME="root"
export GOVC_PASSWORD="********"
export GOVC_URL="192.168.0.240/sdk"

VM作成

vm.createを使う。

基本はこんな感じ。

GUESTOS=centos7_64Guest
CPU=2
MEM=2048
NET=global-network
ADAPTER=vmxnet3
DATASTORE=datastore1
DISK_CONTROLLER=pvscsi
VERSION=6.5
VMNAME=example-vm

govc vm.create \
      -c $CPU \
      -m $MEM \
      -g $GUESTOS \
      -net $NET \
      -net.adapter $ADAPTER \
      -ds $DATASTORE \
      -disk.controller $DISK_CONTROLLER \
      -version $VERSION \
      -on=false \
      $VMNAME

デフォルトのネットワーク(おそらくVM Network)を使う場合は-netは省略できる。(というか指定しても認識してくれなかった)

業務などでvCenter使ってる場合は、上記以外に-dc ${DATA_CENTER}でデータセンタ、-host ${HOSTNAME}でホストを指定。ホストの代わりに-poolでリソースプールも指定可。
また、-folderで作成するVMのフォルダも指定できる。

-gで指定するゲストOSのID一覧はこの辺: VirtualMachineGuestOsIdentifier

設定パラメタの追加

vm.change

f:id:zaki-hmkc:20200405075708p:plain

例えばこのdisk.enableUUID=1という値を設定したい場合はvm.changeでできる。
vm.createには該当オプションはないので、一度VMを作成してから追加すればよい。

govc vm.change \
    -e "disk.enableUUID=1" \
    -vm $VMNAME

ちなみにこのパラメタはvSphere上でDynamic Provisioningするときに使用する。

ディスク作成

vm.disk.create

VM作成は、ディスク(ストレージ)作成のオプションがないので、別途作成してアタッチする必要がある。
複数のディスクが必要な場合は、都度作成する。
作成時に、-vmでアタッチ対象のVMを指定できるので、作成とアタッチは同時に可能。

だいたいこんな感じ

DATASTORE=datastore1
DISK_SIZE=20GB
VMNAME=example-vm

govc vm.disk.create \
      -size $DISK_SIZE \
      -thick=false \
      -ds $DATASTORE \
      -name $VMNAME/$VMNAME.vmdk \
      -vm $VMNAME

-nameで作成場所を指定する必要がある。
通常(UIでぽちぽち作成する場合)は、データストア上にVMディレクトリ名以下にvmdkファイルが作成されるので、それに倣う場合は上記のように${vm名}/${vm名}.vmdkと指定しておけばOK

上記はシンプロビジョニングでディスクを作成しているが、シックの場合は-thick=trueを指定する。
シックプロビジョニングで更にEager Zeroed指定する場合は、-eager=trueも指定する。

シンプロビジョニング と シックプロビジョニング の違い - VMware - Project Group

NICの追加

vm.network.add

VM作成時にはNICは1個しか指定できない。
追加のNICがある場合は、NICの追加をする。

だいたいこんな感じ。

NET2=local-network
ADAPTER=vmxnet3
VMNAME=example-vm

govc vm.network.add \
      -net $NET2 \
      -net.adapter $ADAPTER \
      -vm $VMNAME

VMの削除

vm.destroy

説明不要だとうと思いつつ補足すると、ディスクも全部消える。

VMNAME=example-vm

govc vm.destroy \
    $VMNAME

ドキュメントにも記載ある通り、ディスクを残す場合は事前にディスクをデタッチした上でvm.destroyVMを削除する。
デタッチするにはdevice.removeを使う。

ディスクをデタッチした上でVMを削除するには以下の通り。

VMNAME=example-vm

govc device.remove \
      -vm $VMNAME \
      -keep disk-*

govc vm.destroy \
      $VMNAME

あとはわかるな?

docs.ansible.com

Ansibleだと設定をYAMLで持たせたることができて、単純なシェルスクリプトgovcを使う場合に比べて繰り返し処理や設定の可読性などが強力なのでお勧め。

※ もちろん(PyVmomiのインストールに制限がないなど)使用可能であればvmware_guestでも問題ない


情報参照

この辺りは無償ライセンスのgovcでもできる。

host情報

$ govc host.info
Name:              localhost.naru.jp-z.jp
  Path:            /ha-datacenter/host/localhost.naru.jp-z.jp/localhost.naru.jp-z.jp
  Manufacturer:    Intel(R) Client Systems
  Logical CPUs:    8 CPUs @ 2712MHz
  Processor type:  Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  CPU usage:       652 MHz (3.0%)
  Memory:          65404MB
  Memory usage:    26946 MB (41.2%)
  Boot time:       2019-10-13 13:53:38.197109 +0000 UTC
  State:           connected

-host hostnameで、対象ホストを指定できる

VM一覧

govc lsでitemの一覧を列挙し、VMに該当するものを更に引数に指定する。
…でいいのかな?

$ govc ls
/ha-datacenter/vm
/ha-datacenter/network
/ha-datacenter/host
/ha-datacenter/datastore
$ govc ls /ha-datacenter/vm
:
:
/ha-datacenter/vm/okd4-master0.esxi.jp-z.jp
/ha-datacenter/vm/okd4-master1.esxi.jp-z.jp
/ha-datacenter/vm/okd4-master2.esxi.jp-z.jp
/ha-datacenter/vm/okd4-worker0.esxi.jp-z.jp
/ha-datacenter/vm/okd4-worker1.esxi.jp-z.jp
/ha-datacenter/vm/pxe-sample
/ha-datacenter/vm/win10-offline
/ha-datacenter/vm/restricted-centos
/ha-datacenter/vm/k8s-master01.esxi.jp-z.jp
/ha-datacenter/vm/k8s-worker01.esxi.jp-z.jp
/ha-datacenter/vm/k8s-worker02.esxi.jp-z.jp
/ha-datacenter/vm/k8s-worker03.esxi.jp-z.jp
/ha-datacenter/vm/esxi-host

VM情報

$ govc vm.info manager.local.jp-z.jp
Name:           manager.local.jp-z.jp
  Path:         /ha-datacenter/vm/manager.local.jp-z.jp
  UUID:         564d13d6-d760-89aa-9174-883b8565a58c
  Guest name:   CentOS 7 (64-bit)
  Memory:       8192MB
  CPU:          2 vCPU(s)
  Power state:  poweredOn
  Boot time:    2020-02-17 10:47:01.574822 +0000 UTC
  IP address:   192.168.0.19
  Host:         localhost.naru.jp-z.jp

バイス情報

VMにセットされている各種デバイス(NICやディスクやビデオカードなどなど)を表示

$ govc device.ls -vm manager.local.jp-z.jp
ide-200       VirtualIDEController       IDE 0
ide-201       VirtualIDEController       IDE 1
ps2-300       VirtualPS2Controller       PS2 controller 0
pci-100       VirtualPCIController       PCI controller 0
sio-400       VirtualSIOController       SIO controller 0
keyboard-600  VirtualKeyboard            Keyboard
pointing-700  VirtualPointingDevice      Pointing device; Device
video-500     VirtualMachineVideoCard    Video card
vmci-12000    VirtualMachineVMCIDevice   Device on the virtual machine PCI bus that provides support for the virtual machine communication interface
usb-7000      VirtualUSBController       Auto connect Disabled
pvscsi-1000   ParaVirtualSCSIController  VMware paravirtual SCSI
ahci-15000    VirtualAHCIController      AHCI
cdrom-16000   VirtualCdrom               ISO [cheddar-share] disk2/archive/iso/CentOS-7-x86_64-Minimal-1804.iso
cdrom-16001   VirtualCdrom               ISO [cheddar-share] disk2/archive/iso/CentOS-7-x86_64-Minimal-1908.iso
disk-1000-0   VirtualDisk                62,914,560 KB
ethernet-0    VirtualVmxnet3             VM Network
ethernet-1    VirtualVmxnet3             private-network-1
ethernet-2    VirtualVmxnet3             restricted-network-1

詳細を表示するにはdevice.info

$ govc device.info -vm manager.local.jp-z.jp
Name:               ide-200
  Type:             VirtualIDEController
  Label:            IDE 0
  Summary:          IDE 0
  Key:              200
  Devices:          
Name:               ide-201
:
:
Name:               cdrom-16000
  Type:             VirtualCdrom
  Label:            CD/DVD drive 1
  Summary:          ISO [cheddar-share] disk2/archive/iso/CentOS-7-x86_64-Minimal-1804.iso
  Key:              16000
  Controller:       ahci-15000
  Unit number:      0
  Connected:        true
  Start connected:  true
  Guest control:    true
  Status:           ok
:
:
Name:               disk-1000-0
  Type:             VirtualDisk
  Label:            Hard disk 1
  Summary:          62,914,560 KB
  Key:              2000
  Controller:       pvscsi-1000
  Unit number:      0
  File:             [WDS100T2B0A] manager.local.jp-z.jp/manager.local.jp-z.jp-000001.vmdk
  Parent:           [WDS100T2B0A] manager.local.jp-z.jp/manager.local.jp-z.jp.vmdk
Name:               ethernet-0
  Type:             VirtualVmxnet3
  Label:            Network adapter 1
  Summary:          VM Network
  Key:              4000
  Controller:       pci-100
  Unit number:      7
  Connected:        true
  Start connected:  true
  Guest control:    true
  Status:           ok
  MAC Address:      00:0c:29:65:a5:8c
  Address type:     generated
Name:               ethernet-1
  Type:             VirtualVmxnet3
  Label:            Network adapter 2
:
:

似たようなCLI操作はVirtualBoxでもできる

zaki-hmkc.hatenablog.com