ミニPCを手に入れたのでproxmoxを触ってみる

terraformを使ったVM作成まで

今回参考にした記事は、一番下にリンクをおいておく。

ミニPCを手に入れた。GMKtecのNucBox3というやつで、Amazonで1.4万弱で購入した。 スペックは、

CPU Celeron J4125
Mem DDR4 8GB
SSD 128GB

結構値段の割にいいと思う(中古のシンクラ的なやつのほうがスペックは良さそうだけど、こっちは新品だし、入手も簡単だし)。

届いてから知ったが、CeleronとPentiumを統合した新しいブランドIntel Processorになるらしい。で、今、出始めているN100、N95がコスパめちゃ高そうで次買うならそれらかな~。

とりあえず起動してみる

起動すると、windows11のセットアップ画面にいった。適当にすすめていって、ライセンス認証までできた。

activeになっている

でもwindowsは使わないので、これだけ。

Proxmoxをインストールする

公式ダウンロードページからisoをダウンロードして、適当なUSBに書き込む。

BIOSからUSBでブートさせるようにして、起動。適当にインストーラを進めた。

Hostnameのところはpve.localとした。IPはDHCPで192.168.0.20を与える。DNSはちゃんと使えるDNSサーバーを指定する。8.8.8.8とか1.1.1.1とか、もしかしたら192.168.0.1とか。

5分もせずにインストールが終わった。終わったらUSBを抜いておく。

Proxmoxの初期設定

https://192.168.0.20:8006/からGUIが見れる。そこからshell操作もできる。

aptのリポジトリを無償版にする

deb http://download.proxmox.com/debian/pve bullseye pve-no-subscriptionを追加。

/etc/apt/sources.list
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
deb http://ftp.jp.debian.org/debian bullseye main contrib

deb http://ftp.jp.debian.org/debian bullseye-updates main contrib

+ # PVE pve-no-subscription repository provided by proxmox.com,
+ # NOT recommended for production use
+ deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription

# security updates
deb http://security.debian.org bullseye-security main contrib

有償版リポジトリを無効に(コメントアウト)する。

/etc/apt/sources.list.d/pve-enterprise.list
1
+ # deb https://enterprise.proxmox.com/debian/pve bullseye pve-enterprise

VMを作る

今回はterraformを使って、VMを作る。

クラウドイメージからVM作成 -> テンプレート化 -> テンプレートからVM作成といった流れ。

テンプレートを作る

ブラウザから、作られていく状況(コマンドの反映)を見ることができる。

以下はブラウザのconsoleで実行した。

# proxmoxノード内でやる(今回は`pve`)
# cloud imageを取得
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img -O ubuntu-22.04-server-cloudimg-amd64.img
# イメージを編集するツールをいれる
apt install libguestfs-tools -y
# qemu-guest-agentを入れる
# ipアドレスをダッシュボードから見たりできるようになる
virt-customize -a ubuntu-22.04-server-cloudimg-amd64.img --install qemu-guest-agent
# vmを作成
qm create 9000 --net0 virtio,bridge=vmbr0
# 名前を付ける
qm set 9000 --name ubuntu-22.04
# ディスクイメージをインポート(qemu-img形式)
qm importdisk 9000 ubuntu-22.04-server-cloudimg-amd64.img local-lvm
# インポートしたディスクをvirtio0としてアタッチ
qm set 9000 --scsihw virtio-scsi-pci --virtio0 local-lvm:vm-9000-disk-0
# ブートデバイスを選択
qm set 9000 --boot order=virtio0
# Cloud-initが使うCD-ROMドライブを追加
qm set 9000 --ide2 local-lvm:cloudinit
# DNSを設定する
qm set 9000 --nameserver 192.168.0.1
# 最後にテンプレート化
qm template 9000

apiトークンを作る

Datacenter -> Permissions -> API Tokens -> Addでトークンを発行できる。

userをroot@pam、Token IDをterraform、Privilege Separationのチェックを外す。

以下のようなトークンが得られる

root@pam!terraform
9b742f84-9a21-4d05-84c3-36d3f6a4c00c

Terraformを使ってテンプレートからVMを作る

環境はこんなかんじ。

❯ terraform -version
Terraform v1.4.2
on darwin_arm64
+ provider registry.terraform.io/telmate/proxmox v2.9.14

main.tfを用意する。その中で、先程取得したtokenなどを使う。

main.tf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
variable username {}
variable public_key {}
variable cores {}
variable memory {}
variable disk_size {}
variable ip_address {}

terraform {
  required_providers {
    proxmox = {
    source  = "telmate/proxmox"
    version = "2.9.14"
    }
  }
}

provider "proxmox" {
  pm_api_token_id = "root@pam!terraform"
  pm_api_token_secret = "9b742f84-9a21-4d05-84c3-36d3f6a4c00c"
  pm_api_url = "https://192.168.0.20:8006/api2/json"
  pm_tls_insecure = true
}

resource "proxmox_vm_qemu" "temp-vm" {
  name = "temp-vm-${var.username}"
  target_node = "pve"
  clone = "ubuntu-22.04"
  os_type = "cloud-init"
  boot = "order=virtio0"
  cores   = "${var.cores}"
  memory  = "${var.memory}"
  disk {
    storage = "local-lvm"
    type = "virtio"
    size = "${var.disk_size}G"
    backup = false
  }
  network {
    model = "virtio"
    bridge = "vmbr0"
    firewall = false
  }
  ipconfig0 = "ip=${var.ip_address}/24,gw=192.168.0.1"
  ciuser = "${var.username}"
  sshkeys = <<EOF
${var.public_key}
EOF

}

変数を書いた、vm1.tfvarsも作る。

2コア、メモリ2GB、ディスク20GB、IP192.168.0.51を指定する。

public_keyを正しいものにしないと、ログインできなくなる。

vm1.tfvars
1
2
3
4
5
6
username = "testuser"
public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDi41SY7y05u3bt/ntCCSaeu2Sdb/usUI4gkZYFSInyGe4FmHXxuTCqimcKwH08kBP0CgEf8WJIQOG4/foM64iI/8EN2uFYQ5rEPYoIWKgUJbfKEUL5b+gPEd4++tvu3mPX0rvhHUmuVEHKhB+xAlYV8FAzOH0zCkSteRFmaRAbbX2E+fhl1n6Z4ruwdgYmF06Jn8QnHuMw0yKsV/8Wn2nLzBOUR4Du9gf3mD4EluN2POO9FIv0IH14bteLgqyOsTwWV+FRkZGMH1Zi0fE6Y+ewaii0bwf8nFqpIAIVHAZSimtl1mdLg7UcJrDfTM7I4XdMANxYVqIaQEMHQRAcHTBJaDX5B0ed/Y0T3NW0/sdOHZyL3zryw2S+NB9ll9Sq1EyI3IFnEZrAFuQVIip5xQCOZWoUghMDeyOBfx7bvy4bJWtKBC6VfMPIvXiqxEO9mKK3RGLMPepQYT+IIaFmDOXKAqV036dVqIA6DX9KEx8Ey220sG4/dtiGYu2DdshgEo0= user@test"
cores = 2
memory = 2048
disk_size = 20
ip_address = "192.168.0.51"

デプロイする

❯ terraform init
❯ terraform plan -var-file vm1.tfvars
❯ terraform apply -var-file vm1.tfvars

以下のようになって、VMが作られる。ヤッタネ。

❯ terraform apply -var-file vm1.tfvars

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  + create

Terraform will perform the following actions:

  # proxmox_vm_qemu.temp-vm will be created
  + resource "proxmox_vm_qemu" "temp-vm" {
      + additional_wait           = 5
      + automatic_reboot          = true
      + balloon                   = 0
      + bios                      = "seabios"
      + boot                      = "order=scsi0"
      + bootdisk                  = (known after apply)
      + ciuser                    = "testuser"
      + clone                     = "ubuntu-22.04"
      + clone_wait                = 10
      + cores                     = 2
      + cpu                       = "host"
      + default_ipv4_address      = (known after apply)
      + define_connection_info    = true
      + force_create              = false
      + full_clone                = true
      + guest_agent_ready_timeout = 100
      + hotplug                   = "network,disk,usb"
      + id                        = (known after apply)
      + ipconfig0                 = "ip=192.168.0.51/24,gw=192.168.0.1"
      + kvm                       = true
      + memory                    = 2048
      + name                      = "temp-vm-testuser"
      + nameserver                = (known after apply)
      + onboot                    = false
      + oncreate                  = true
      + os_type                   = "cloud-init"
      + preprovision              = true
      + reboot_required           = (known after apply)
      + scsihw                    = "lsi"
      + searchdomain              = (known after apply)
      + sockets                   = 1
      + ssh_host                  = (known after apply)
      + ssh_port                  = (known after apply)
      + sshkeys                   = <<-EOT
            ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDi41SY7y05u3bt/ntCCSaeu2Sdb/usUI4gkZYFSInyGe4FmHXxuTCqimcKwH08kBP0CgEf8WJIQOG4/foM64iI/8EN2uFYQ5rEPYoIWKgUJbfKEUL5b+gPEd4++tvu3mPX0rvhHUmuVEHKhB+xAlYV8FAzOH0zCkSteRFmaRAbbX2E+fhl1n6Z4ruwdgYmF06Jn8QnHuMw0yKsV/8Wn2nLzBOUR4Du9gf3mD4EluN2POO9FIv0IH14bteLgqyOsTwWV+FRkZGMH1Zi0fE6Y+ewaii0bwf8nFqpIAIVHAZSimtl1mdLg7UcJrDfTM7I4XdMANxYVqIaQEMHQRAcHTBJaDX5B0ed/Y0T3NW0/sdOHZyL3zryw2S+NB9ll9Sq1EyI3IFnEZrAFuQVIip5xQCOZWoUghMDeyOBfx7bvy4bJWtKBC6VfMPIvXiqxEO9mKK3RGLMPepQYT+IIaFmDOXKAqV036dVqIA6DX9KEx8Ey220sG4/dtiGYu2DdshgEo0= user@test
        EOT
      + tablet                    = true
      + target_node               = "pve"
      + unused_disk               = (known after apply)
      + vcpus                     = 0
      + vlan                      = -1
      + vmid                      = (known after apply)

      + disk {
          + backup             = false
          + cache              = "none"
          + file               = (known after apply)
          + format             = (known after apply)
          + iops               = 0
          + iops_max           = 0
          + iops_max_length    = 0
          + iops_rd            = 0
          + iops_rd_max        = 0
          + iops_rd_max_length = 0
          + iops_wr            = 0
          + iops_wr_max        = 0
          + iops_wr_max_length = 0
          + iothread           = 0
          + mbps               = 0
          + mbps_rd            = 0
          + mbps_rd_max        = 0
          + mbps_wr            = 0
          + mbps_wr_max        = 0
          + media              = (known after apply)
          + replicate          = 0
          + size               = "20G"
          + slot               = (known after apply)
          + ssd                = 0
          + storage            = "local-lvm"
          + storage_type       = (known after apply)
          + type               = "virtio"
          + volume             = (known after apply)
        }

      + network {
          + bridge    = "vmbr0"
          + firewall  = false
          + link_down = false
          + macaddr   = (known after apply)
          + model     = "virtio"
          + queues    = (known after apply)
          + rate      = (known after apply)
          + tag       = -1
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

proxmox_vm_qemu.temp-vm: Creating...
proxmox_vm_qemu.temp-vm: Still creating... [10s elapsed]
proxmox_vm_qemu.temp-vm: Still creating... [20s elapsed]
proxmox_vm_qemu.temp-vm: Still creating... [30s elapsed]
proxmox_vm_qemu.temp-vm: Still creating... [40s elapsed]
proxmox_vm_qemu.temp-vm: Creation complete after 40s [id=pve/qemu/100]

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

このイメージはqemu-guest-agentを追加してあるため、DHCPでIPを割り振っても、webから確認できる。

IPsから見れる

おわり

ブラウザからも今回作ったテンプレート(ID9000)は使えて、それをもとにcloud-initも使用してGUIから簡単にVMを作成できる。もちろんqmコマンドでもできる。

作って壊してってやってるだけでも面白い。

webコンソール

以下のリンクも要参照。

Built with Hugo
Theme Stack designed by Jimmy