Terraform
定義の本体は terraform/vms.tf と terraform/lxcs.tf。モジュールの変数は モジュール。
新規 VM の追加
terraform/vms.tf に module ブロックを追加する。
ISO からインストールする場合
module "vm_300" {
source = "./modules/vm"
vm_id = 300
name = "example"
cores = 2
memory = 2048
disk = 32
on_boot = false
# cdrom = {
# file_id = "local:iso/ubuntu-24.04-live-server-amd64.iso"
# }
}
cloud image + cloud-init で作成する場合
disk_import_from に Proxmox 上の cloud image を指定し、cloud_init で初期設定を行う。
module "vm_210" {
source = "./modules/vm"
node_name = "pve-02"
vm_id = 210
name = "mail-server"
cores = 2
memory = 2048
disk = 20
on_boot = true
disk_import_from = "local:import/resolute-server-cloudimg-amd64.img.qcow2"
cloud_init = {
username = "ubuntu"
fqdn = "mail.example.com"
ipv4_address = "192.168.40.210/24"
ipv4_gateway = "192.168.40.1"
}
}
cloud-init テンプレートは terraform/modules/vm/cloud-init/ にあり、デフォルトは ubuntu-base。
snippet の内容を変更すると VM の initialization が置き換えられるため、VM 自体が再作成される場合がある。
新規 LXC の追加
terraform/lxcs.tf に module ブロックを追加する。
import 直後の設定は既存コンテナに合わせた詳細な項目が多いが、新規作成時は必要な項目だけ指定する運用を想定している。
console はモジュール側でデフォルト値(enabled=true, tty_count=2, type=tty)があるため、通常は省略できる。
既存リソースの import
手動で作成済みの VM / LXC を Terraform 管理下に移す流れ。
terraform/vms.tf/terraform/lxcs.tfに module ブロックを追加する- 一時的に
terraform/imports.tfを作成し、import ブロックを追加する(ID 形式:"<node_name>/<vm_id>") terraform/でterraform planし、差分がないことを確認するterraform applyで import を実行する- plan の差分が解消されたら
imports.tfを削除する
import {
to = module.vm_200.proxmox_virtual_environment_vm.this
id = "pve/200"
}