InfraVMを指定して、vSAN APIでCluster Shutdownを試みる

 

背景

想定外停電時など、UPSと連携してAPI経由で自動的にvSAN Clusterをシャットダウンするスクリプトを作成したい。

環境は内部VC構成であり、かつクラスタ内にAD/DNSおよびスクリプトVMといったインフラVMが存在する条件でもAPIでシャットダウンできるようにスクリプトを作成したい

 

 

参考サイト

PerformClusterPowerAction

vSAN Management SDK for Python

 

前回ブログ

 

スクリプトの解説

 

実行環境の準備については前回のブログを参照願いたい。

samplecodeにあるvsanclustershutdownsamples.py コピー&編集して差分が以下になるように作成した

 

 

# diff vsanclustershutdownsamples.py vsanclustershutdownsamples_internalVC_with_InfraVMs.py

93c93,96

<                print("FAIL:", test.testName)

---

>                 if test.testName == 'VMware vCenter appliance is deployed on this vSAN cluster':

>                     return True

>                 else:

>                     print("FAIL:", test.testName)

124c127,130

< 

---

>    infra_vms = get_vms_by_name(si, INFRA_VM_NAMES)

>    if not infra_vms:

>            raise RuntimeError("指定したインフラVMが見つかりませんでした")

>    cspec.SetInfraVMs(infra_vms)

136a143,161

> INFRA_VM_NAMES = ["<VM>"]

> def get_vms_by_name(si, vm_names):

>     """

>     名前で VM を検索して vim.VirtualMachine のリストを返す

>     """

>     content = si.RetrieveContent()

>     container = content.rootFolder

>     view = content.viewManager.CreateContainerView(

>         container, [vim.VirtualMachine], True

>     )

>     name_set = set(vm_names)

>     result = []

>     try:

>         for vm in view.view:

>             if vm.name in name_set:

>                  result.append(vm)

>     finally:

>         view.Destroy()

>     return result

 

INFRA_VM_NAMESのリストに、インフラVMとして指定したい仮想マシンの名前を入力しておけば、get_vms_by_namevim.VirtualMachineのリストにして返してくれるので、その出力をcspecvim.cluster.PerformClusterPowerActionSpec)のSetInfraVMs セッターを利用して入力している。

SetInfraVMsについては公開資料から情報が見つけられなかったが、以下のようにhelpを表示したら存在が確認できた。

 

# python3.12

Python 3.12.12 (main, Jan  6 2026, 15:11:09) [GCC 8.5.0 20210514 (Red Hat 8.5.0-28)] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import vsanmgmtObjects

>>> import vsanapiutils

>>> from pyVmomi import vim

>>> 

>>> help(vim.cluster.PerformClusterPowerActionSpec)

 

helpに細かい使い方が記載されていたわけではないが、vim.VirtualMachineのリストを代入したらうまく動いた

 

 

動作確認

内部VC、かつvSANクラスタ内にインフラVMが稼働している状態でスクリプトを実行した。

スクリプトは問題なく動作し、停止時にインフラVMが自動的に停止し、次回起動時に自動的にインフラVMが起動するのを確認できた。

 

 

おわりに

今回は、スクリプト内で静的にインフラVM名を指定する仕組みを取っているが、もちろん作りこみによってスクリプトに渡す引数で指定する形にしたり、対話式で入力させるようなことも可能である。

その辺は、実際に運用をする人たちの工夫に任せたい。

 

コメント

このブログの人気の投稿

vSwitchにSTPが不要な理由

NTPと同期してくれないときのトラブルシューティング

ESXi に DNS サーバを何個まで登録できるか