vSAN APIを使ってShutdownを実行する
背景
想定外停電時など、UPSと連携してAPI経由で自動的にvSAN Clusterをシャットダウンするスクリプトを作成したい。
参考サイト
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 API(PyVmomi)をインストールする
# pip install --upgrade pyvmomi
vSphere 8.0U3からはvSAN Management SDK for Pythonがpyvmomiに内包されているためこれ一つをインストールするだけでよい。
また、今回利用するサンプルスクリプトを含むパッケージを以下からダウンロードしておく。(要ログイン)
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)
あとは、このスクリプトに環境に合わせた引数を渡して実行するだけである。
おわりに
今回は想像以上に簡単に目的を達成することができた。
PyvmomiにvSAN Management APIが内蔵されたことで準備も非常に簡単であり、サンプルスクリプトがあったことでAPIの仕様を読み解く必要がなかった。
逆に、サンプルスクリプトがなければハードルが高かったように思う。
今回はvCenterサーバのみが稼働している状態(いつでもShutdown可能な状態)を想定しているが、実際の環境では業務用の仮想マシンが起動していたり、DNSサーバなどのインフラVMもクラスタ上で稼働している状況も想定が必要である。
業務仮想マシンについてはUPS側の機能で対応できる場合もあるが、そうでない場合はスクリプトで作りこむことも可能ではある。ただし、APIやスクリプトに関するそれなりのスキルが必要である。
インフラVMについてもAPIの仕様を読み解けば、スクリプトを書き換えて指定したVMをインフラVMとして自動停止・起動させることも可能になる(はず。。。試してはいない)
今回はそこまでの目的ではないので、また機会があればチャレンジしたい。
コメント
コメントを投稿