🔥

昨日リリースされたばかりのProxmox Provider v3.0.1-rc5を使ってProxmoxのVM作成を自動化した

2024/11/25に公開

はじめに

最近ミニPCとProxmoxで自宅にインフラ環境を構築したものの、手動でVMを作成するのが面倒になったため、Terarformで自動化することにしました。
すると、つい昨日新しいバージョンのProxmox Providerがリリースされたとのことだったので、レビューも兼ねて使ってみました。
2系からの大きな変更としては、disksレイアウトが導入されたというもので、日本語による情報が少なかったため、今回はその変更点を中心に紹介します。

Terraform Provider for Proxmox

https://github.com/Telmate/terraform-provider-proxmox

現在上記のリポジトリで開発されているProxmox Providerのバージョンは、v3.0.1-rc系(rc: Release Candidate)であり、まだ正式リリースされていません。
今回は、その中でも最新のv3.0.1-rc5を使ってみたので、その使い方やこれまでのrc系における変更点を紹介します。

Quick Guide

作成したリポジトリ

初めてTerraformに触ったということもあり、色々と沼りましたが、最終的に下記リポジトリのようにまとまりました。

https://github.com/AobaIwaki123/Proxmox-VM-Terraform

私的に使用しているリポジトリなため、不要なディレクトリはmake clean-envで削除できるようになっています。

全体の流れ

  1. 前提: Proxmox環境の準備 (Proxmox: 8.3.0)
  2. 前提: Terraform環境の作成 (Terraform: v1.9.8)
  3. 作業1: Proxmox API Tokenの作成
  4. 作業2: Proxmox Providerの設定
  5. 作業3: VM Templateの作成
  6. 作業4: VM毎にTerraformの設定を記述
  7. 作業5: VMの作成

作業1: Proxmox API Tokenの作成

Tokenの作成手順については、こちらを参考にしました。

$ pvesh create /access/users/root@pam/token/sample --privsep 0
┌──────────────┬──────────────────────────────────────┐
│ key          │ value                                │
╞══════════════╪══════════════════════════════════════╡
│ full-tokenid │ root@pam!sample                      │
├──────────────┼──────────────────────────────────────┤
│ info         │ {"privsep":"0"}                      │
├──────────────┼──────────────────────────────────────┤
│ value        │ ed1c77c5-3738-43d0-bd07-ffc7b25977fd │
└──────────────┴──────────────────────────────────────┘

作業2: Proxmox Providerの設定

$ make copy-provider

modules/proxmox_vm/provider.tfにファイルが作成されるので、Proxmox API Tokenの情報を記述してください。

provider "proxmox" {
  pm_api_url          = "https://192.168.11.12:8006/api2/json" # ProxmoxのURL
  pm_api_token_id     = "root@pam!sample" # Proxmox API Tokenのfull-tokenid
  pm_api_token_secret = "ed1c77c5-3738-43d0-bd07-ffc7b25977fd" # Proxmox API Tokenのvalue
  pm_tls_insecure     = true # SSL証明書の検証を無効化
}

作業3: VM Templateの作成

以下のコマンドをproxmoxのノード上で実行してVM Templateを作成します。
Cephを使用しない場合は、すべてのProxmox NodeでTemplateを作成する必要があります。(必要なければ教えていただきたい)
スクリプトはこちらを参考にしました。

$ wget https://cloud-images.ubuntu.com/oracular/current/oracular-server-cloudimg-amd64.img -O ubuntu-24.10-server-cloudimg-amd64.img
# Base VM configuration
$ qm create 9200 --net0 virtio,bridge=vmbr0
$ qm importdisk 9200 ubuntu-24.10-server-cloudimg-amd64.img local-lvm
$ qm set 9200 --name ubuntu-24.10a
$ qm set 9200 --scsihw virtio-scsi-pci --virtio0 local-lvm:vm-9200-disk-0
$ qm set 9200 --boot order=virtio0
$ qm set 9200 --ide2 local-lvm:cloudinit
$ qm set 9200 --nameserver 127.0.0.53 --searchdomain localdomain
# Convert VM to VM Template
$ qm template 9200

作業4: VM毎にTerraformの設定を記述

  • 私的に使用しているリポジトリなので不要なファイルをまず削除します。
$ make clean-env # 不要なenvを削除
  • その後、VMを作成するための雛形を作成します。
$ make create-vm-env ENV_NAME=test

envs/testに雛形が作成されます。
envs/test/terraform.tfvarsにVMの設定を記述してください。

設定可能な項目
  • hostname : VMのホスト名
  • username : VMにログインするユーザ名
  • public_key : VMにログインするための公開鍵
  • cores : CPUのコア数
  • memory : メモリのサイズ (MB)
  • disk_size : ディスクのサイズ (GB)
  • ip_address : VMに割り当てるIPアドレス
  • gateway : VMに割り当てるゲートウェイ
  • target_node : Proxmoxのノード名
  • template : VMのテンプレート名
  • storage : VMのストレージ名
  • bride : VMに割り当てるネットワークブリッジ
  • vmid : VMのID

作業5: VMの作成

あとは、以下のコマンドでVMを作成できます。

$ cd envs/test
envs/test $ make tf-init
envs/test $ make tf-apply

削除したいときは、以下の通りです。

envs/test $ make tf-destroy

v3.0.1-rc系の主な変更点

特に今回実装するにあたって関連した部分を重点的に紹介します。

v3.0.1-rc1

Breaking Changes

disksレイアウトが導入されました。
rc2の変更からもわかるように、おそらくv3.0.1では今まで雑多に定義してきたものをdisksにまとめることを目的としているのだと思います。
個人的には、ネストが深すぎて少しわかりづらいと感じましたが、今後もリリースを追いながら実装意図に対する理解を深めていきたいと思います。

resource "proxmox_vm_qemu" "intern-vm" {
...
  disk {
-   storage = "local-lvm"
-   type = "virtio"
-   size = "64G"
+   virtio { # データ用のディスク
+       virtio0 {
+       disk {
+           size = "64G"
+           storage = "local-lvm"
+       }
+       }
+   }
  }
}

v3.0.1-rc2

Breaking Changes

  • cloudinit_cdrom_storageが廃止されました。
    • 代わりにdisksブロックにcloudinit用のディスクを定義するようになりました。(ここが一番沼った、、、)
resource "proxmox_vm_qemu" "k8s-vm" {
...
- cloudinit_cdrom_storage = "local-lvm"

  disks {
+   ide { # CloudInitの設定を書き込むためのディスク
+     ide2 {
+       cloudinit {
+         storage = "local-lvm"
+       }
+     }
+   }
    ...
  }
}

v3.0.1-rc3

Breaking Changesはありませんでしたが、rc2において重大なバグがあっため、rc3がリリースされました。

v3.0.1-rc4

Breaking Changesはなく主にバグ修正が行われました。

v3.0.1-rc5

Breaking Changes

  • networkインターフェースにおいて、idの指定が必須になりました。
    • id0から31の値をとります。
  network {
+   id = 0
    model    = "virtio"
    bridge   = "vmbr0"
    firewall = false
  }

2024/11/26 追記: v3.0.1-rc6

rc5における重大な欠陥であるpm_tls_insecureがデフォルトでtrueになっているという問題が修正されました。
これによりデフォルト設定がよりセキュアになりました。

おわりに

TerraformもProxmox Providerも初めて触りましたが、意外と簡単に自動化できて楽しかったです。
特に、VMの追加や削除がとても簡単になったのでちょっとした開発環境を作るときに億劫になることがなくなりました。
また、Proxmox Providerはまだ安定版ではないものの活発にコミュニティが動いているのでまた何か変更があればレビューしたりして、OSS貢献していきたいと思います。

参考

GitHubで編集を提案

Discussion