「Click-ops」という名の悪夢
私は現在、Proxmox VE上で約12台の仮想マシン(VM)とコンテナを運用するホームラボを構築しています。ここは、KubernetesクラスタからHome Assistant、自動化ボットにいたるまで、あらゆるものをテストする場所です。
当初、ProxmoxのWeb UIにログインしてISOを選択し、1〜2台のVMに対してCPUやRAMを構成するのは簡単なことでした。しかし、3ノードのK3sクラスタを素早く構築したり、ラボ環境のリセットを繰り返したりする必要が出てくると、それは「苦行」へと変わりました。
繰り返しのクリック操作は退屈なだけでなく、非常にミスが起きやすいものです。QEMU Agentの有効化を忘れたり、VLANの設定を間違えたりするだけで、デバッグにさらに15〜20分を費やすことになります。この状況から脱却するための唯一の解決策が、Infrastructure as Code (IaC)です。
なぜスクリプトやAnsibleではなくTerraformなのか?
pvesh、API、またはAnsibleのモジュールを使用してProxmoxをリモート制御する方法はいくつかあります。しかし、Terraformには独自の強みがあります:
- スクリプト(Bash/Python): 通常、状態管理(State)の機能がありません。スクリプトを2回実行すると、既存のものを更新する代わりに、重複したVMが作成されてしまう可能性があります。
- Ansible: ソフトウェアのインストール(構成管理)には非常に強力です。しかし、ハードウェアリソースの初期作成(プロビジョニング)においては、Terraformほどスムーズかつ明快ではありません。
Terraformはステートファイル(State file)を通じてインフラを管理します。現在のシステムに何が存在するかを正確に把握しています。コード内でRAMを2GBから4GBに増やすと、Terraformは最初から作り直すのではなく、アップグレードコマンドのみを適切に実行します。
準備するもの
コードを書き始める前に、以下の3つの要素を準備する必要があります:
- Proxmox APIトークン: セキュリティのため、rootユーザーは絶対に使用しないでください。
PVEVMAdmin権限を持つ専用のAPIトークンを作成します。 - Terraform: ローカルPCまたは管理用サーバーにインストールしておきます。
- Cloud-initイメージ: これが極めて重要です。VMのキーボードに触れることなく、TerraformでIPやSSHキーを自動設定するには、Cloud-initテンプレートから仮想マシンを作成する必要があります。
ステップ1:APIトークンの発行
Proxmoxのインターフェースで Datacenter > Permissions > API Tokens にアクセスします。ユーザー(例:terraform-user)のトークンを作成したら、すぐに Secret ID を保存してください。これは画面に一度しか表示されません。
ステップ2:Terraformプロバイダーの設定
Proxmoxのエコシステムでは、活発なコミュニティサポートがある Telmate のプロバイダーが最も一般的です。
プロバイダーを宣言するために、以下の内容で main.tf ファイルを作成します:
terraform {
required_providers {
proxmox = {
source = "telmate/proxmox"
version = "2.9.14"
}
}
}
provider "proxmox" {
pm_api_url = "https://192.168.1.100:8006/api2/json"
pm_api_token_id = "terraform-user@pve!mytoken"
pm_api_token_secret = "your-very-secret-token"
pm_tls_insecure = true
}
最初の仮想マシンをデプロイする
私の経験から言うと、Terraformを使用する際に空のISOファイルからVMをインストールしてはいけません。Terraformがクローンを作成できるように、Cloud-initがプリインストールされた VMテンプレート を用意してください。
以下は、Ubuntu Serverを素早く作成するためのサンプルコードです:
resource "proxmox_vm_qemu" "ubuntu_server" {
count = 1
name = "vm-terraform-${count.index}"
target_node = "pve-node-01"
clone = "ubuntu-22.04-template"
cores = 2
sockets = 1
memory = 2048
agent = 1 # ProxmoxがVMからIPを取得できるようにする
disk {
size = "20G"
type = "scsi"
storage = "local-lvm"
}
network {
model = "virtio"
bridge = "vmbr0"
}
os_type = "cloud-init"
ipconfig0 = "ip=192.168.1.5${count.index}/24,gw=192.168.1.1"
sshkeys = <<EOF
ssh-rsa AAAAB3NzaC1yc2E... your-public-key
EOF
}
3つの運用ステップ
コードの準備ができたら、ワークフローは以下の3つのコマンドに集約されます:
terraform init: 必要なプラグインをダウンロードします。terraform plan: 変更内容をプレビューします。重要なデータを誤って削除しないようにするための重要なステップです。terraform apply: 実際のデプロイを確定します。
実際、コマンドを使用することで、わずか45秒でVMの作成が完了します。手動で行う場合、通常1台あたり5〜10分かかります。
実践で得た重要な注意点
ProxmoxでIaCを実践する中で、システムを壊さないために学んだ教訓がいくつかあります:
- .tfstateファイルの保護: このファイルには、インフラの全構成、さらにはプレーンテキストのパスワードが含まれています。絶対に公開GitHubにコミットしないでください。
- 変数(Variables)の活用: IPやトークンをコードにハードコードしないでください。
variables.tfファイルに分離して、管理とセキュリティを向上させましょう。 - VM IDの管理: Proxmoxは識別用にID(100、101など)を使用します。手動で作成したVMとの衝突を避けるために、Terraform専用のID範囲(例:500以降)を割り当てることをお勧めします。
結び
TerraformとProxmoxの組み合わせは、エンタープライズ環境だけのものではありません。ホームラボであっても、この手法はシステム思考と再現性を鍛えるのに非常に役立ちます。
サーバーに問題が発生しても、コマンド一つで以前と全く同じ仮想マシン群を復元できます。今日からIaCを試してみてください。その生産性の向上に、きっと驚くはずです。

