govc による vSphere 環境のシャットダウン自動化

はじめに

govc を利用した vSphere 環境の操作、特にシャットダウンの自動化に関する紹介。
後半にサンプルスクリプトあり。

私の自宅ラボでは電気代節約のためスクリプトでシャットダウンの自動化を実施している。

govc とは

govc とは govmomi の一つとして開発が進められているユーザーフレンドリな vSphere CLI 。
※ govmomi = vSphere API を扱う Go のライブラリ

govc の導入
❯ curl -L -o - "https://github.com/vmware/govmomi/releases/latest/download/govc_$(uname -s)_$(uname -m).tar.gz" | sudo tar -C /usr/local/bin -xvzf - govc 

# 確認
❯ which govc
/usr/local/bin/govc

❯ govc version
govc 0.32.0
govc Usage

基本的に -h でコマンドのヘルプを表示できるのでそちらを都度確認する。

もしくは、以下を参照。
https://github.com/vmware/govmomi/blob/main/govc/USAGE.md

❯ govc -h
❯ govc $cmd -h

# Ref
❯ govc ls -h
Usage: govc ls [OPTIONS] [PATH]...

List inventory items.

Examples:
  govc ls -l '*'
  govc ls -t ClusterComputeResource host
  govc ls -t Datastore host/ClusterA/* | grep -v local | xargs -n1 basename | sort | uniq
環境変数の設定

コマンドの実行には最低限接続先の ESXi あるいは vCenter の情報が必要となる。

いきなり実行しようとすると以下のように失敗する。

❯ govc datacenter.info
govc: specify an ESX or vCenter URL

以下の環境変数にて指定

export GOVC_URL=XXXXX
export GOVC_USERNAME=XXXXX
export GOVC_PASSWORD=XXXXX
export GOVC_INSECURE=true

❯ govc datacenter.info

Name:                DC-Homelab-01
  Path:              /DC-Homelab-01
  Hosts:             6
  Clusters:          3
  Virtual Machines:  29
  Networks:          19
  Datastores:        10
esxcli の利用

Tips。govc から直接情報取得できないものなど。

❯ govc host.esxcli -host.dns=XXXXX system version get

Build:    Releasebuild-22088125
Patch:    25
Product:  VMware ESXi
Update:   1
Version:  8.0.1
Hostのシャットダウン

メンテナンスモードからのシャットダウンの実行。

「vCLS 仮想マシン退避の支援」というタスクが自動でトリガされるので、少し時間はかかるがvCLSが稼働している状態からもメンテナンスモードにいれることができた。

# Enter maintenance mode
esxi_host="XXXXX"
govc host.maintenance.enter -host.dns="$esxi_host"

# Shutdown Host
govc host.shutdown -host.dns="$esxi_host"
稼働しているVMのシャットダウン

基本的にメンテナンスモードにいれる前に稼働している VM はシャットダウンする必要がある。

まず特定のホスト上で稼働している仮想マシンをみつけたい。

これは、-runtime.XXX あたりの情報でしぼれそう。vm.infojson で出力すればいろいろ情報が得られそうなので、それを参考にする。

例えば仮想マシンの電源状態であれば、-runtime.powerState、稼働ホストであれば -runtime.host など。

❯ govc vm.info -json /DC-XXX/vm/XXXXX/ubuntu-01 > test.txt
...
"runtime": {
          ...
          "host": {
            "type": "HostSystem",
            "value": "host-27"
          },
          "connectionState": "connected",
          "powerState": "poweredOn",
          "faultToleranceState": "notConfigured",
	...

❯ govc find . -type m -runtime.powerState poweredOn -runtime.host "HostSystem:host-27"
/DC-XXX/vm/XXXXX/ubuntu-02
/DC-XXX/vm/XXXXX/ubuntu-01

あとはコマンドで取得した結果として vm.power にわたせばOK

❯ govc find . -type m -runtime.powerState poweredOn -runtime.host "HostSystem:host-27" | xargs govc vm.power -s
Shutdown guest VirtualMachine:vm-1001... OK
Shutdown guest VirtualMachine:vm-46... OK
特定のホスト上の全VM及びホストの自動シャットダウンスクリプト

最後にこれまでの内容を含めた、複数ホストの自動シャットダウンスクリプトを紹介する。

参考サイト

https://github.com/vmware/govmomi/blob/main/govc/README.md