PythonでVMwareインベントリを自動化:Excel作業の苦しみから解放されよう

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

背景: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のファイアウォール設定を確認してください。自動化を成功させて、穏やかな夜の当番時間を過ごせることを願っています!

Share: