背景:Excelとクリック作業がナイトメア(悪夢)になるとき
このようなシナリオを想像してみてください。午前2時、上司から監査のために300台以上の仮想マシンの構成リストを朝8時までに用意するよう連絡が来ました。もしvSphere Client上で1台ずつVMをクリックしてコピー&ペーストしていたら、少なくとも3時間は無意味な作業に費やすことになります。8台のESXiホストと数百台の仮想マシンで構成される大規模なシステムでは、手動作業は遅いだけでなく、極めてミスが発生しやすくなります。
多くのエンジニアはWindows上でPowerCLIを使用しますが、Linuxを使用している場合や、ダッシュボードにレポートを自動的に統合したい場合は、pyVmomi(VMware用Python SDK)が最適な選択肢です。このツールを使えば、複雑な管理操作を再利用可能なコードに変えることができます。
インベントリの自動化により、入力ミスを完全に排除できます。徹夜する代わりに、Pythonスクリプトを数秒実行するだけで、各MACアドレスまで詳細に記載されたレポートファイルを受け取ることができるのです。
インストール:ツールの準備
まず、Python 3.8以上が必要です。ライブラリをシステムのグローバル環境に直接インストールせず、virtualenvを使用して環境をクリーンに保ち、バージョンの競合を避けましょう。
# 仮想環境の作成
python3 -m venv venv-vmware
source venv-vmware/bin/activate
# pyVmomiライブラリのインストール
pip install pyvmomi
pyvmomiライブラリは、vCenter APIと通信するためのVMware公式ツールセットです。プロフェッショナルなCSVレポートを出力したい場合はpandasを追加でインストールすることもできますが、基本的なニーズにはPython標準のcsvライブラリで十分です。
実装:リソーススキャン用スクリプトの作成
pyVmomiを使い始めたときによく遭遇する壁は、SSL証明書エラー(Certificate Verify Failed)です。これは、vCenterが自己署名証明書を使用していることが原因です。この問題は、接続部分で対処します。
1. vCenterへの接続設定
まず、ServiceInstanceを通じて接続を初期化します。これがインフラデータ全体にアクセスするための唯一のエントリポイントとなります。
import ssl
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
# 内部証明書のSSL検証をスキップする設定
s = ssl._create_unverified_context()
def connect_vcenter(host, user, password):
try:
si = SmartConnect(host=host, user=user, pwd=password, sslContext=s)
return si
except Exception as e:
print(f"接続エラー: {e}")
return None
2. 仮想マシンデータの抽出
vCenterはオブジェクトをツリー構造(Inventory Tree)で管理しています。CreateContainerViewを使用すると、各フォルダを手動で辿ることなく、すべての仮想マシンリストを素早く取得できます。
def get_all_vms(si):
content = si.RetrieveContent()
container = content.viewManager.CreateContainerView(
content.rootFolder, [vim.VirtualMachine], True
)
vm_data = []
for vm in container.view:
summary = vm.summary
config = vm.config
info = {
"Name": summary.config.name,
"Status": summary.runtime.powerState,
"CPU": config.hardware.numCPU,
"RAM_GB": config.hardware.memoryMB / 1024,
"IP": summary.guest.ipAddress if summary.guest else "N/A",
"OS": config.guestFullName
}
vm_data.append(info)
container.Destroy()
return vm_data
上記のコードは、名前、ステータス、CPU、RAM、IPといった重要なパラメータに焦点を当てています。注意点として、仮想マシンにVMware Toolsがインストールされていない場合、ipAddressフィールドは空の値を返します。
3. CSVレポートの出力
上司がすぐにExcelで開けるように、データリストをCSV形式に変換しましょう。
import csv
def export_to_csv(data, filename="vcenter_inventory.csv"):
if not data: return
keys = data[0].keys()
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=keys)
writer.writeheader()
writer.writerows(data)
print(f"レポートの準備ができました: {filename}")
実践アドバイス:大規模システム向けの最適化
500台以上のVMがある大規模なクラスタでスクリプトを実行する場合、上記のように各オブジェクトをループする方法では速度面で不利になります。最適化のためには、PropertyCollectorを使用することをお勧めします。このメカニズムによりデータを一括でフェッチ(取得)できるため、スキャン時間を数分から数秒に短縮できます。
セキュリティの問題も極めて重要です。vCenterのパスワードをコード内に直接記述(ハードコード)することは絶対に避けてください。環境変数を使用してログイン情報を保護しましょう。
export VC_PASSWORD="YourSecretPassword"
python inventory_script.py
繰り返しの作業に時間を浪費するのではなく、Pythonに任せましょう。このスクリプトがあれば、Enterキーを押し、コーヒーを淹れて戻ってくる頃には、レポートが上司のデスクに届く準備ができているはずです。
もし Connection Timed Out エラーが発生した場合は、スクリプト実行マシンとvCenter間のポート443のファイアウォール設定を確認してください。自動化を成功させて、穏やかな夜の当番時間を過ごせることを願っています!

