PythonでProxmox VEを自動化:クリック作業で時間を無駄にするのはもうやめよう

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

ProxmoxにWeb UIがあるのに、なぜスクリプトを使うのか?

約12台のVMやコンテナ(Home AssistantからK8sラボまで)を運用して半年、ある残酷な現実に気づきました。ProxmoxのUIでのクリック操作は、最初は楽しいですが、反復作業になると苦行でしかありません。以前は、新しいビルドをテストするたびに、VMの作成、ISOの選択、RAM/CPU構成の手動設定に15分かかっていました。

そこで出会ったのが proxmoxer — Proxmox APIと非常にスムーズに連携できるPythonライブラリです。何度もクリックする代わりに、コマンドを1行実行するだけで済みます。このスクリプトのおかげで、セットアップ時間は15分から45秒足らずに短縮されました。この記事では、よりクリエイティブなことに時間を使えるよう、システムを自動化した方法を共有します。

クイックスタート:PythonでProxmoxに5分で接続する

まず、proxmoxerrequests ライブラリをインストールする必要があります。セキュリティのため、ノードのrootパスワードではなくAPIトークンを使用しましょう。

pip install proxmoxer requests

Proxmoxインターフェースの Datacenter -> Permissions -> API Tokens でAPIトークンを作成してください。その後、以下のコードを使って接続を確認します:

from proxmoxer import ProxmoxAPI

# 接続情報
HOST = '192.168.1.100'
USER = 'root@pam'
TOKEN_NAME = 'my-python-script'
TOKEN_VALUE = 'your-token-secret-here'

proxmox = ProxmoxAPI(
    HOST,
    user=USER,
    token_name=TOKEN_NAME,
    token_value=TOKEN_VALUE,
    verify_ssl=False
)

# ノード一覧の取得を試行
for node in proxmox.nodes.get():
    print(f"Node: {node['node']}, Status: {node['status']}")

ターミナルに online ステータスが表示されれば、接続成功です!

テンプレートからVMを自動作成するスクリプトの構築

OSをゼロからインストールする代わりに、私は常に「ゴールデンイメージ」(テンプレート)を使用しています。新しいマシンが必要なときは、それをクローンするだけです。この方法により、ディスク容量と待ち時間を大幅に節約できます。

高速VMクローンスクリプト

以下は、テンプレート(vmid 100)から新しいマシンに仮想マシンを複製するために使用しているコードです:

def create_vm_from_template(node, template_id, new_vmid, new_name):
    print(f"{new_name}をクローン中...")
    proxmox.nodes(node).qemu(template_id).clone.create(
        newid=new_vmid,
        name=new_name,
        full=1 # 完全に独立させるためのフルクローン
    )
    
    # クローン後のリソースカスタマイズ
    proxmox.nodes(node).qemu(new_vmid).config.set(memory=2048, cores=2)
    print(f"VM {new_vmid} の準備が完了しました!")

create_vm_from_template('pve-node-01', 100, 201, 'web-server-prod')

スナップショット管理:いじくり回す前の「救命浮輪」

新しいサービスをインストールしたりシステムをアップグレードしたりする前には、必ずスナップショット作成スクリプトを実行しています。もし誤って壊してしまっても(よくあることですが)、ロールバックコマンド一つで元通りです。これにより、稼働中のシステムに大きな変更を加える際も自信を持って作業できます。

def take_snapshot(node, vmid, snapname):
    try:
        proxmox.nodes(node).qemu(vmid).snapshot.create(
            snapname=snapname, 
            description="変更前の自動スナップショット"
        )
        print(f"VM {vmid} のスナップショット '{snapname}' を作成しました")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

take_snapshot('pve-node-01', 201, 'pre_upgrade_backup')

リソース監視:RAM不足の回避

多くのVMを実行すると、特にリソースの限られたミニサーバーではRAMが過負荷になりがちです。システム全体をスキャンする小さなスクリプトを書きました。VMが割り当てられたRAMの90%以上を消費している場合、スクリプトは即座にアラートを出します。

def monitor_resources():
    print("--- システムヘルスチェック ---")
    for node in proxmox.nodes.get():
        vms = proxmox.nodes(node['node']).qemu.get()
        for vm in vms:
            if vm['status'] == 'running':
                mem_usage = (vm['mem'] / vm['maxmem']) * 100
                if mem_usage > 90:
                    print(f"警告: VM {vm['name']} が RAM を {mem_usage:.2f}% 消費しています!")

# 'schedule'ライブラリを使用して、この関数を30分ごとに実行できます

導入6ヶ月後の「血の滲むような」教訓

Proxmox APIを使用する際、データの損失やスクリプトのフリーズを避けるために注意すべき点がいくつかあります:

  • 環境変数の管理: トークンをコードに直接貼り付けないでください。セキュリティのために .env ファイルと python-dotenv ライブラリを使用しましょう。
  • タスクステータスの確認: 大容量(100GB以上)のVMをクローンする場合、APIがタイムアウトすることがあります。プロセスがいつ完了したかを確実に把握するために、タスクステータス(UPID)を確認する関数を追加してください。
  • 最小権限の原則: トークンに管理者(Administrator)権限を与えないでください。スクリプトの目的に応じて、VM.SnapshotVM.Audit などの権限のみを付与するようにしましょう。

Proxmox管理にPythonを導入したことは、まさに転換点でした。夜遅くまでラボのセットアップをしていたのが、今では作業の80%を自動化できています。もし5台以上の仮想マシンを管理しているなら、今すぐ proxmoxer を試してみてください。もっと早く知っておけばよかったと後悔するはずです!

Share: