ProxmoxをTerraformで自動化:手動の「Click-ops」からプロフェッショナルなIaCへ

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

「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つの要素を準備する必要があります:

  1. Proxmox APIトークン: セキュリティのため、rootユーザーは絶対に使用しないでください。PVEVMAdmin権限を持つ専用のAPIトークンを作成します。
  2. Terraform: ローカルPCまたは管理用サーバーにインストールしておきます。
  3. 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つのコマンドに集約されます:

  1. terraform init: 必要なプラグインをダウンロードします。
  2. terraform plan: 変更内容をプレビューします。重要なデータを誤って削除しないようにするための重要なステップです。
  3. 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を試してみてください。その生産性の向上に、きっと驚くはずです。

Share: