Skip to content

Terraform

定義の本体は terraform/vms.tfterraform/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 管理下に移す流れ。

  1. terraform/vms.tf / terraform/lxcs.tf に module ブロックを追加する
  2. 一時的に terraform/imports.tf を作成し、import ブロックを追加する(ID 形式: "<node_name>/<vm_id>"
  3. terraform/terraform plan し、差分がないことを確認する
  4. terraform apply で import を実行する
  5. plan の差分が解消されたら imports.tf を削除する
import {
  to = module.vm_200.proxmox_virtual_environment_vm.this
  id = "pve/200"
}