昨日リリースされたばかりのProxmox Provider v3.0.1-rc5を使ってProxmoxのVM作成を自動化した
はじめに
最近ミニPCとProxmoxで自宅にインフラ環境を構築したものの、手動でVMを作成するのが面倒になったため、Terarformで自動化することにしました。
すると、つい昨日新しいバージョンのProxmox Providerがリリースされたとのことだったので、レビューも兼ねて使ってみました。
2
系からの大きな変更としては、disks
レイアウトが導入されたというもので、日本語による情報が少なかったため、今回はその変更点を中心に紹介します。
Terraform Provider for Proxmox
現在上記のリポジトリで開発されているProxmox Providerのバージョンは、v3.0.1-rc
系(rc: Release Candidate)であり、まだ正式リリースされていません。
今回は、その中でも最新のv3.0.1-rc5
を使ってみたので、その使い方やこれまでのrc
系における変更点を紹介します。
Quick Guide
作成したリポジトリ
初めてTerraformに触ったということもあり、色々と沼りましたが、最終的に下記リポジトリのようにまとまりました。
私的に使用しているリポジトリなため、不要なディレクトリはmake clean-env
で削除できるようになっています。
全体の流れ
- 前提: Proxmox環境の準備 (Proxmox: 8.3.0)
- 前提: Terraform環境の作成 (Terraform: v1.9.8)
- 作業1: Proxmox API Tokenの作成
- 作業2: Proxmox Providerの設定
- 作業3: VM Templateの作成
- 作業4: VM毎にTerraformの設定を記述
- 作業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
の指定が必須になりました。-
id
は0
から31
の値をとります。
-
network {
+ id = 0
model = "virtio"
bridge = "vmbr0"
firewall = false
}
v3.0.1-rc6
2024/11/26 追記: rc5
における重大な欠陥であるpm_tls_insecure
がデフォルトでtrue
になっているという問題が修正されました。
これによりデフォルト設定がよりセキュアになりました。
おわりに
TerraformもProxmox Providerも初めて触りましたが、意外と簡単に自動化できて楽しかったです。
特に、VMの追加や削除がとても簡単になったのでちょっとした開発環境を作るときに億劫になることがなくなりました。
また、Proxmox Providerはまだ安定版ではないものの活発にコミュニティが動いているのでまた何か変更があればレビューしたりして、OSS貢献していきたいと思います。
Discussion