- 前回M75q-tinyにProxmoxをインストールした記事を書いたので、今回はProxmoxでTerraformを使ってテンプレートVMから、VMをクローンする話を書こうと思う
大まかな流れ
- Proxmoxホストで、Terraform用のユーザ/ロールの作成&APIトークンの作成
- Terraformのインストール
- テンプレートVMの準備
- Terraformファイルの準備&実行
”Docs overview | Telmate/proxmox | Terraform | Terraform Registry”: https://registry.terraform.io/providers/Telmate/proxmox/latest/docs
Terraformのセットアップは、公式ガイドの通りなんだけど、ちょっと分かりづらかったので整理しておく。
- Terraformを使う事前準備として、Proxmoxのユーザ管理コマンドpveumを使って、Terraformで使用するためのロールとユーザを作成する
## ロールの作成
pveum role add TerraformProv -privs "Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt SDN.Use"
## ユーザの作成と確認
pveum user add terraform-prov@pve --password Passw0rd!
pveum aclmod / -user terraform-prov@pve -role TerraformProv
## ロールとユーザの確認
pveum role list
pveum user list
次に認証用のAPIトークンを作成する。TerraformでProxmoxのAPIを叩くためには、パスワード認証とAPIトークンによる認証の2つがあって、今回はAPIトークンを使う。
- APIトークンは、Proxmoxの管理画面から作成できる
- Datacenter -">> Permisson -">> API Token
- このとき「PriviledgeSeparation」のチェックは外す
- Terraformは、Proxmoxホストでは無く、クライアント端末にインストールする。そしてAPIを使ってProxmoxを利用する形
- インストール方法は、公式サイトを参照してほしい
developer.hashicorp.com
テンプレートVMの作成
今回は、Proxmox上に予め用意したテンプレートVMから、新しいVMをTerraformで作成する。なので、まず指定する仮想マシンテンプレートをProxmoxに登録する。
- テンプレートVMの用意は、ゼロから新しいVMを作ってテンプレートVMに変換する方法と、クラウドイメージを利用する方法があり、簡単のために今回はUbuntuのクラウドイメージを使うことにする
- 下記URLからProxmoxホストのローカルディスクにダウンロードしてくる
- このimgファイルをインポートしてテンプレートVM(ID 9100)を作成してみると、失敗する
## これは失敗する
qm disk import 9100 noble-server-cloudimg-amd64.img proxthin
Configuration file 'nodes/pve/qemu-server/9100.conf' does not exist
- テンプレートVM(ID 9100)の設定ファイルが存在しないという話。なので、VMの”箱”を作ってあげる必要がある
- 管理GUIから作成してみる。このとき、ProxmoxのVM作成ウィザードで表示されるデフォルトの仮想Disksは削除してVMを作成する
- そして、用意したクラウドイメージをそのVM(9100)にアタッチしてあげる
root@pve:~# qm disk import 9100 noble-server-cloudimg-amd64.img proxthin --format qcow2
importing disk 'noble-server-cloudimg-amd64.img' to VM 9100 ...
format 'qcow2' is not supported by the target storage - using 'raw' instead
Logical volume "vm-9100-disk-0" created.
transferred 0.0 B of 3.5 GiB (0.00%)
transferred 3.5 GiB of 3.5 GiB (100.00%)
Successfully imported disk as 'unused0:proxthin:vm-9100-disk-0'
- 最後に、管理GUIを開いて、9100のVM画面から"More"メニューからテンプレートに変換する
- この手順は、CLIとGUIを行ったり来たりしてるので、GUIだけ、もしくはCLIだけで操作出来ると良いのだけど・・・
- 次に、作成したテンプレートVMから仮想マシンを作成するために、Terraformに渡すタスクファイルを作成する必要がある
- tfファイルに記載するパラメータの詳細は以下の公式サイトを参照してほしい
以下のファイルを「create-vm.tf」ファイルとして用意する。途中、値が埋め込まれているので、自身の環境に応じたパラメータに変更してあげる必要がある
variable proxmox_token_id {}
variable proxmox_token_secret {}
variable cores {}
variable memory {}
variable disk_size {}
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = "3.0.1-rc4"
}
}
}
provider "proxmox" {
pm_api_token_id = "${var.proxmox_token_id}"
pm_api_token_secret = "${var.proxmox_token_secret}"
pm_api_url = "https://172.16.1.3:8006/api2/json" ## デプロイするノード名のIPアドレスに変更する
pm_tls_insecure = true
}
resource "proxmox_vm_qemu" "clone-vm" {
name = "clone-vm"
target_node = "prx01" ## デプロイするノード名に変更する
clone = "al8" ## 使用するテンプレート名に変更する
full_clone = true
os_type = "cloud-init"
scsihw = "virtio-scsi-pci"
cores = "${var.cores}"
memory = "${var.memory}"
disk {
slot = "scsi0"
storage = "data"
type = "disk"
size = "${var.disk_size}G"
}
boot = "order=scsi0;net0"
}
同様に、以下を「create-vm.tfvars」ファイルとして作成する。
proxmox_token_id = "<your token id>"
proxmox_token_secret = "<your token secret>"
cores = 4
memory = 4096
disk_size = 32
実行
まずtfファイルを用意したディレクトリで、terraform init
を実行する
╰─$ terraform init 1 ↵
Initializing the backend...
Initializing provider plugins...
- Finding telmate/proxmox versions matching "3.0.1-rc4"...
- Installing telmate/proxmox v3.0.1-rc4...
- Installed telmate/proxmox v3.0.1-rc4 (self-signed, key ID A9EBBE091B35AFCE)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
- Terraform has been successfully initialized!と出力されていればOK
- 次に、planで実行に問題がないか確認してみる
terraform plan -var-file="create-vm.tfvars"
- 特に問題がなさそうであれば、applyする。途中で、実行するかどうか確認があるので「yes」を入力して実行する
terraform apply -var-file="create-vm.tfvars"
- 少し待って以下のようにCreation completeとなればOK
Enter a value: yes
proxmox_vm_qemu.clone-vm: Creating...
proxmox_vm_qemu.clone-vm: Still creating... [10s elapsed]
proxmox_vm_qemu.clone-vm: Still creating... [20s elapsed]
proxmox_vm_qemu.clone-vm: Still creating... [30s elapsed]
proxmox_vm_qemu.clone-vm: Still creating... [40s elapsed]
proxmox_vm_qemu.clone-vm: Creation complete after 41s [id=prx01/qemu/102]
Proxmox側でVMが作られていて、無事にOSが起動していればOK
作ったVMを削除する場合は、以下のコマンドを実行すれば良い
- terraform destroy -var-file="create-vm.tfvars"
今回は、以上。