vSAN APIを使ってShutdownを実行する

 背景

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

 

 

参考サイト

PerformClusterPowerAction

vSAN Management SDK for Python

 

 

スクリプトの解説

vSAN Management API にある PerformClusterPowerActionを利用することで、vSANの機能を利用したクラスタシャットダウンをAPIで実行できる。

実際のコードはvSAN Management SDK for Python パッケージ内にあるvsanclustershutdownsamples.pyをほぼ丸々利用する。

 

ただし、このスクリプトはそのままではSelf Managed vCenter環境(vSANクラスタ上にvCenterがいる構成)のシャットダウンをすることができない。

なぜならば、スクリプト内のClusterPowerOffPrecheckにて、Self Managed vCenter環境ではエラーになってしまうためである。

そこで、ヘルスチェック結果でその項目だけ正常(green)以外のステータスを許容するように少しだけスクリプトを書き換える必要がある。

 

スクリプト実行環境

Ubuntu 24.04.2

Python 3.12.3

 

シャットダウン対象クラスタ情報

vSphere  8.0.3, 24585383

vSAN ESA 4ノード環境

vCenter Serverのみが起動している状態(それ以外のVMは事前に停止しておく)

DNS/NTPなどの必須の環境サービスはvSANクラスタ外で健全に動作しているとする

 

 

スクリプトの準備と実行手順

 

まずは必要なPython SDK for the VMware vSphere APIPyVmomi)をインストールする

 

# pip install --upgrade pyvmomi

 

vSphere 8.0U3からはvSAN Management SDK for Pythonpyvmomiに内包されているためこれ一つをインストールするだけでよい。

 

また、今回利用するサンプルスクリプトを含むパッケージを以下からダウンロードしておく。(要ログイン)

vSAN Management SDK for Python

 

ダウンロードしたvsan-sdk-python.zipファイル内のsamplecodeフォルダにある、vsanclustershutdownsamples.pyをスクリプト実行環境に転送する。

このファイルをコピー&編集して差分が以下になるようにする

 

 # diff vsanclustershutdownsamples.py vsanclustershutdownsamples_internalVC.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)

 

 

あとは、このスクリプトに環境に合わせた引数を渡して実行するだけである。

# python3 vsanclustershutdownsamples_internalVC.py -s <vCenter IP> -o 443 -u administrator@vsphere.local -p <vCenter SSO admin Password> --cluster <Cluster Name> --poweraction poweroff

 

 

おわりに

今回は想像以上に簡単に目的を達成することができた。

PyvmomivSAN Management APIが内蔵されたことで準備も非常に簡単であり、サンプルスクリプトがあったことでAPIの仕様を読み解く必要がなかった。

逆に、サンプルスクリプトがなければハードルが高かったように思う。

今回はvCenterサーバのみが稼働している状態(いつでもShutdown可能な状態)を想定しているが、実際の環境では業務用の仮想マシンが起動していたり、DNSサーバなどのインフラVMもクラスタ上で稼働している状況も想定が必要である。

 

業務仮想マシンについてはUPS側の機能で対応できる場合もあるが、そうでない場合はスクリプトで作りこむことも可能ではある。ただし、APIやスクリプトに関するそれなりのスキルが必要である。

インフラVMについてもAPIの仕様を読み解けば、スクリプトを書き換えて指定したVMをインフラVMとして自動停止起動させることも可能になる(はず。。。試してはいない)

 

今回はそこまでの目的ではないので、また機会があればチャレンジしたい。

 

 

 

 

コメント

このブログの人気の投稿

vSwitchにSTPが不要な理由

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

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