VMware WorkstationをREST APIで自動化する:クリック操作からコードによる管理へ

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

なぜGUIを卒業してAPIに移行すべきなのか?

1つか2つのシンプルなラボを動かすだけなら、VMware Workstationのインターフェースを開いて仮想マシンを1つずつクリックしても問題ありません。しかし、CI/CDパイプラインを構築している場面を想像してみてください。コードをプッシュするたびに、テスト用にクリーンな状態(clean state)の仮想マシンを起動し、5分間のテスト後に自動で削除して8GBのメモリを解放するといった運用が必要な場合、手動操作は現実的ではありません。

多くの方はPowerCLIを思い浮かべるでしょう。非常に強力なツールですが、PowerShellやWindowsに依存するという制約があります。一方、VMware Workstation REST APIは圧倒的に柔軟です。LinuxのBashスクリプト、Pythonアプリケーション、さらにはPostmanからでも仮想マシンを制御できます。

大規模なプロジェクトの実例では、APIを利用することで環境構築時間を90%削減できることもあります。ラボの準備に15分かけていた作業が、たった1つのコマンドで完了するようになります。

クイックスタート:2分でAPIサーバーを起動する

デフォルトでは、VMware WorkstationのAPIサーバーは有効になっていません。インストールディレクトリにある実行ファイル vmrest.exe を使用して、手動で起動する必要があります。

ステップ1:認証情報の設定

まず、管理者権限でターミナル(cmdまたはPowerShell)を開きます。C:\Program Files (x86)\VMware\VMware Workstation ディレクトリに移動し、ユーザー名とパスワードを作成するコマンドを実行します。

vmrest.exe -u admin -p MySecretPassword

注意:このパスワードは、後ほどHTTPリクエストの認証に使用されます。

ステップ2:サーバーの実行

設定完了後、以下のコマンドを入力するだけです。

vmrest.exe

Served to http://127.0.0.1:8697 と表示されれば、サーバーはリクエストを受け付ける準備が整っています。

VMware REST APIの仕組み

このAPIは、ポート8697で待機するローカルWebサーバーとして機能します。仮想マシンの管理操作はすべて、GET、PUT、POSTといった標準的なHTTPリクエストを通じて行われます。

認証(Authentication)

認証には Basic Auth(基本認証)を使用します。Base64でエンコードされたユーザー名とパスワードをヘッダーに含める必要があります。Postmanを使用する場合は、「Authorization」タブで「Basic Auth」を選択し、情報を入力するだけで完了します。

仮想マシン一覧の取得

既存の仮想マシンのIDを取得するには、エンドポイント /api/vms に対して GET リクエストを送信します。

cURLを使用した例:

curl -u "admin:MySecretPassword" -X GET http://127.0.0.1:8697/api/vms

レスポンスはJSON配列で返されます。後のステップで仮想マシンを制御するために必要となるため、id の値をメモしておいてください。

実践:コマンドラインで仮想マシンを操作する

よく使われる3つの主要なコマンドを紹介します。

1. 仮想マシンの状態を確認する

仮想マシンのIDが ABC123XYZ である場合、確認コマンドは以下のようになります。

curl -u "admin:MySecretPassword" -X GET http://127.0.0.1:8697/api/vms/ABC123XYZ/power

2. 仮想マシンを起動する(Power On)

PUT メソッドを使用し、ボディに on を渡します:

curl -u "admin:MySecretPassword" -X PUT http://127.0.0.1:8697/api/vms/ABC123XYZ/power -H "Content-Type: application/vnd.vmware.vmw.rest-v1+json" -d "on"

3. 仮想マシンを安全にシャットダウンする

急に電源を切るのではなく、shutdown を使用してゲストOSを適切な手順でシャットダウンさせます:

curl -u "admin:MySecretPassword" -X PUT http://127.0.0.1:8697/api/vms/ABC123XYZ/power -H "Content-Type: application/vnd.vmware.vmw.rest-v1+json" -d "shutdown"

Pythonによる一括管理の最適化

仮想マシンの数数十台に及ぶ場合、1つずつcURLコマンドを打つのは非常に時間がかかります。Pythonは、これらを一括処理するための完璧なソリューションです。

import requests
from requests.auth import HTTPBasicAuth

BASE_URL = "http://127.0.0.1:8697/api"
AUTH = HTTPBasicAuth('admin', 'MySecretPassword')

def power_on_lab_vms():
    # すべての仮想マシンリストを取得
    vms = requests.get(f"{BASE_URL}/vms", auth=AUTH).json()
    
    for vm in vms:
        # "Lab"ディレクトリ内の仮想マシンのみを起動
        if "Lab" in vm['path']:
            url = f"{BASE_URL}/vms/{vm['id']}/power"
            headers = {'Content-Type': 'application/vnd.vmware.vmw.rest-v1+json'}
            requests.put(url, auth=AUTH, headers=headers, data="on")
            print(f"起動コマンド送信完了: {vm['path']}")

power_on_lab_vms()

導入時の実践的なアドバイス

  • データセキュリティ: ポート8697をインターネットに公開しないでください。LAN経由でリモート制御が必要な場合は、特定の固定IPのみを許可するようにファイアウォールを設定してください。
  • ポート競合の解決: ポート8697が他のアプリケーションで使用されている場合は、vmrest.exe -p 9000 のようにコマンドで別のポートに変更してください。
  • 必須要件: シャットダウンや仮想マシンのIP取得などの機能は、対象の仮想マシンに VMware Tools がインストールされている場合にのみ動作します。
  • 内部ドキュメント: VMwareにはSwaggerインターフェースが組み込まれています。ブラウザで http://127.0.0.1:8697 にアクセスするだけで、APIドキュメントの閲覧や直接テストが可能です。

REST APIを使いこなすことで、徐々にInfrastructure as Code (IaC) の考え方へとシフトできます。手動操作を卒業し、コードでラボシステムを自動運用しましょう。

Share: