TerraformでProxmox上にVMを作成してみた

インフラエンジニア志望なのにIaCツール触ったことないのはどうなのよ?ってことで、Terraformをさわさわしてみました。
AWSインスタンスをプロビジョニングしても良かったんですが、インスタンスを止め忘れてえげつない請求が飛んでくるのが怖かったので、とりあえず手元のProxmox環境にVMを立てることから始めてみました。

大まかな手順

  • Terraformから接続するためのユーザ・権限を作成する
  • VMのテンプレートを作成する
  • HCLを記述する
  • Terraform plan/applyでVMを作成する

Terraform用ユーザの作成

https://registry.terraform.io/providers/Telmate/proxmox/latest/docs
公式ドキュメントに沿ってユーザと権限を設定していきます。

pveum role add TerraformProv -privs "VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Monitor VM.Audit VM.PowerMgmt Datastore.AllocateSpace Datastore.Audit"
pveum user add terraform-prov@pve --password <password>
pveum aclmod / -user terraform-prov@pve -role TerraformProv

VMのテンプレート作成

テンプレート作成の手順に関しては、こちらの記事を参考にさせていただきました。
blog.nishi.network
ここで作成したテンプレートをもとにVMを作成していきます。

HCLの記述

先ほど作成したテンプレートをクローンして新たにVMを立てていくため、各種構成を記述したtfファイルを作成します。
はじめに、Proxmoxサーバに接続するための情報をmain.tfに定義していきます。

provider "proxmox"{
    pm_api_url = var.api_url
    pm_user = var.user
    pm_tls_insecure =true
}

さらに、公開したくない情報を別のファイルに定義しておくこともできるため、var.tfにいくつかの値を定義しておきました。

variable "api_url"{
    default = "ProxmoxサーバのURL"
}
variable "user"{
    default = "Proxmoxサーバにログインするユーザ"
}

また、今回はProxmoxプロバイダを使用するため、プラグイン関連の設定をversion.tfに記述しました。

terraform {
    required_providers {
        proxmox = {
            source = "Telmate/proxmox"
            version = "2.9.0"
        }
    }
}

最後に、作成するVMの構成をVMs.tfにまとめていきます。今回は3台のVMKubernetesクラスタを作成することを見込んだ設定としました。

resource "proxmox_vm_qemu" "UbuntuCP"{
    name = "ubuntucp"
    target_node = "atras"
    clone = "UbuntuServerTemplate"
    memory = 2048
    os_type = "cloud-init"

    disk{
        type = "scsi"
        storage = "VMStore"
        size = "20G"
    }
}

resource "proxmox_vm_qemu" "UbuntuWN1"{
    name = "ubuntuwn1"
    target_node = "atras"
    clone = "UbuntuServerTemplate"
    memory = 2048
    os_type = "cloud-init"

    disk{
        type = "scsi"
        storage = "VMStore"
        size = "20G"
    }
}

resource "proxmox_vm_qemu" "UbuntuWN2"{
    name = "ubuntuwn2"
    target_node = "atras"
    clone = "UbuntuServerTemplate"
    memory = 2048
    os_type = "cloud-init"

    disk{
        type = "scsi"
        storage = "VMStore"
        size = "20G"
    }
}

VMの作成

さて、必要なファイルをあらかた定義し終えたので、さっそくProxmoxサーバにVMを作成していきます。
$export PM_PASS="PASSWORD"でProxmoxユーザのパスワードを環境変数に登録し、 $terraform planで、エラーチェックと作成されるVMの構成の確認を行います。
ここで表示された構成で問題がなければ、$terraform applyで実際にVMを作成します。 Apply complete!と表示されれば無事作成が終了していますので、実際にProxmox上で確認してみると、
f:id:KLag:20211111145908p:plain
こんな風に作成できていることがわかります。