pyvmomi で仮想マシンに紐づかない vSAN オブジェクトにストレージポリシーを適用してみる

Overview

概要

vSAN では仮想マシンを構成する VM Home オブジェクトと仮想ディスクオブジェクトには vSphere Client から個別にストレージポリシーを適用することができます。

しかし、vSAN 上にデータストアブラウザから作成したディレクトリのように、仮想マシンに紐づかない vSAN オブジェクトには vSphere Client からストレージポリシーを適用することができません。

どうにかして操作できそうにないかと vSAN Management API のドキュメントを眺めていたところ、目的を達成できそうな以下の vSAN Management API を見つけました。

今回、pyvmomi を使ってこの API を叩くことで、仮想マシンに紐づかない vSAN オブジェクトに対してストレージポリシーを適用する Python スクリプトを作りました(面倒だったので GitHub Copilot に書いてもらいました)。単に API をそのまま呼び出しているだけのスクリプトですが記事として公開しておきます。

背景

仮想マシンに紐づかない vSAN オブジェクトのストレージポリシーを変更する方法として、objtool setPolicyRVC の vsan.object_reconfigure で vSAN オブジェクトを直接編集する方法があります。

しかし、vCenter Server が管理するストレージポリシーを適用しているわけではないため、以下のような不便さが出てきます。

  • vSAN オブジェクトの属性を直接指定する必要があるため、パラメータの指定方法が煩雑になる。
  • クラスタの [監視] タブ > [仮想オブジェクト] 等でストレージポリシーが表示されない。
  • [配置の詳細の表示] からコンポーネントの配置状況は確認できるが、それ以外のポリシーが確認できない。例えばオブジェクト容量の予約を確認しようとすると objtool や RVC での確認が必要になる。

個人的な考えとして、objtool や RVC を vSAN のトラブルシューティング目的で使う分にはこれらのツールの主旨に沿うと思っていますが、上述の通りそもそも vSAN オブジェクトの直接操作なので通常運用時に濫用すべきツールではないと考えています。

このため、もう少し行儀が良い方法が無いか色々とドキュメントを漁ったところ VosSetVsanObjectPolicy API にたどり着いたため、こちらを試してみようと思ったことが背景となります。

スクリプトの置き場所

以下に置きました。

https://github.com/Jangari-nTK/labtools/tree/main/setVsanObjectPolicy
→ setVsanObjectPolicy.py

使い方

以下のように vCenter Server の接続情報、クラスタ名、vSAN オブジェクトの UUID、ストレージポリシーの ID を指定して実行します。

1python setVsanObjectPolicy.py \
2  --vcenter vcsa.jangari.lab \
3  --user administrator@vsphere.local \
4  --password 'VMware1!' \
5  --cluster vSAN-Cluster \
6  --object-uuid fee08c68-8c08-f75a-ae42-a8a159d71789 \
7  --policy-id aa6d5a82-1c88-45da-85d3-3d74b91a5bad

Ubuntu 24.04.2 LTS + Python 3.12.3 + pyvmomi 9.0.0 で動作確認しています。なお、pyvmomi のバージョンが古い場合は vSAN Management SDK for Python が含まれないため、追加でこの SDK のインストールが必要になるかもしれません。

vSAN オブジェクトの UUID の確認

例として、vSAN データストアにデータストアブラウザや osfs-mkdir で手動作成したディレクトリの場合、以下のような確認方法が容易です。

  • クラスタの [監視] タブ > [仮想オブジェクト] でディレクトリ名の非ローカル仮想マシンを展開し、VM ホーム オブジェクトの UUID 列を確認する。
  • データストアブラウザでディレクトリのパスから UUID を確認する。

ストレージポリシーの ID の確認

vSphere Client の [ポリシーおよびプロファイル] > [仮想マシン ストレージ ポリシー] から対象のストレージポリシーを選択して詳細表示した状態で、ブラウザの URL からストレージポリシーの ID が確認できます。

コードの抜粋

スクリプトの中で以下のコードがメインとなる部分です。

ストレージポリシーの ID を含む vim.vm.DefinedProfileSpec (VirtualMachineDefinedProfileSpec) を作成しておき、VsanObjectSystem の VosSetVsanObjectPolicy メソッドに vSAN オブジェクトの UUID と Cluster オブジェクトを渡しているだけです。単純ですね。

 1    api_version = vsanapiutils.GetLatestVmodlVersion(vcenter, 443)
 2    vcMos = vsanapiutils.GetVsanVcMos(si._stub, context=context, version=api_version)
 3    vsan_obj_sys = vcMos.get('vsan-cluster-object-system')
 4    if not vsan_obj_sys:
 5        raise Exception("vsan-cluster-object-system not found in vcMos")
 6
 7    profile = vim.vm.DefinedProfileSpec(profileId=policy_id)
 8
 9    try:
10        result = vsan_obj_sys.SetVsanObjectPolicy(cluster=cluster, vsanObjectUuid=object_uuid, profile=profile)
11        print(f"SetVsanObjectPolicy result: {result}")

スクリプト全体でたった数十行のコードですが、API での操作ができると vSphere Client だけでは実施できないかゆいところに手が届くようになるため非常に便利です。

本当は vSAN MOB でやりたかった

本当は python や pyvmomi などのインストール無しで、vCenter Server 組み込みの vSAN MOB から VosSetVsanObjectPolicy メソッドを叩きたかったのです。

しかし、そこで指定する VirtualMachineDefinedProfileSpec(上述のコード中の vim.vm.DefinedProfileSpec)の XML での書き方が上手いこといかず断念しました。どなたか検証してコミュニティに情報公開してくれる有志の方がいらっしゃったりしないかな・・・

おわりに

個人的に vSphere はできるだけ行儀よく利用する(ソフトウェア内部の設定情報はなるべく直接はいじらない)ことが運用上でトラブルを避けるためのベストプラクティスだと考えています。

通常運用時の作業はできる限り vSphere Client や PowerCLI、vSphere Web Services API や vSphere Automation API を使った vCenter Server の操作で綺麗に実施したいので、今回は pyvmomi で vSphere Web Services API (vSAN Management API) を利用する方法で対応してみました。

vSphere Client だけでなく PowerCLI や vCenter Server 組み込みの各種 API が使えると、より柔軟な運用がおこなえるようになります。トラブルシューティング用のツールに目を向ける前に、まずは公式の SDK/API で同じことができないか調べてみると意外と簡単に実装できることもあります。

加えて、最近は GitHub Copilot や Claude Code などのコーディングエージェントを使えば、単純明快なコードなら一瞬で書いてくれます。今回のスクリプトは GitHub Copilot のエージェントモードに vSAN Management API のドキュメントやサンプルスクリプトを食わせて書いてもらいましたが、色々試しつつ動かすところまでは数分でした。ドキュメントを調べて API を理解するといった事前準備の方が遥かに長かったです。

自身が根本的に面倒くさがりでコーディング自体が好きなわけでもないので、プログラミング言語やフレームワークの仕様を調べたりトラブルシューティングをする等でない作業感のあることにはあまり好奇心がそそられず、なるべく最小限に抑えたいと思っていました。

流行りの AI ツールを最近いくつか試し始めていますが、これらと組み合わせることで vSphere もより迅速かつ柔軟な運用がしやすくなるのかなという印象を受けましたので、もしコーディングエージェントが使える環境なら API の理解や PoC を目的として、バイブコーディングで vSphere を操作する簡単なツールを作ってみるのも良いかもしれません。