📝

Proxmox上のLXCをTerraformで管理する

2023/01/19に公開

なぜやるか

  • Kubernetesクラスタ用のノードを可能な限り手軽にプロビジョニングしたい
  • 自宅で使っているミドルウェアを IaC(Infrastructure as Code)で管理したい

ProxmoxからAPIトークンを取得する

ProxmoxのWeb UIにアクセスし、データセンター → APIトークン → 追加をクリック

トークンIDシークレット とは異なり、トークンIDのサフィックスになる

ここでは簡単のため、rootユーザーに紐付くAPIキーを作成する

作成が完了すると、以下のように トークンID とシークレットが生成される

Terraformのセットアップ

ターミナルで terraform コマンドが実行できる環境を手元に用意する

※ mac os であれば brew install terraform 等

この記事では以下のバージョンを用いる

$ terraform --version
Terraform v1.3.7
on darwin_arm64

ここから先は簡単のために、すべて main.tf に記載するが、ベストプラクティスとしては、内容ごとにファイルを分ける方法がとられている。

https://cloud.google.com/docs/terraform/best-practices-for-terraform#separate-directories

main.tf を作成する

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

provider "proxmox" {
  pm_api_url = "https://192.168.0.40:8006/api2/json"
  # 証明書の検証がが困難な場合は以下をコメントアウトする
  # pm_tls_insecure = true
  pm_api_token_id = "{トークンID}"
  pm_api_token_secret = "{シークレット}"
}

pm_api_url を設定し必要に応じて認証情報も記載する

この例では簡単のために、 pm_api_token_idpm_api_token_secret をハードコーディングしているが、terraformコマンド実行時に環境変数から読み込むことが可能

https://registry.terraform.io/providers/Telmate/proxmox/latest/docs#creating-the-connection-via-username-and-api-token

Terraform の実行

$ terraform init

terraform initをし、ワークスペースの初期化とプラグインのダウンロードを行う

次に terraform plan を行うことで実行内容の確認ができるが、ここでは実行内容がないため、今行っても以下のような出力となる

$ terraform plan

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are
needed.

LXCでコンテナをたてる

main.tf に以下を追記する

target_nodeostemplate などは適宜環境に合わせ変更をする

resource "proxmox_lxc" "basic" {
  target_node  = "pve5amd"
  hostname     = "lxc-basic"
  ostemplate   = "nas:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
  password     = "BasicLXCContainer"
  unprivileged = true

  rootfs {
    storage = "local-lvm"
    size    = "8G"
  }

  network {
    name   = "eth0"
    bridge = "vmbr0"
    ip     = "dhcp"
  }
}

※ ostemplateの nas の部分は実際にテンプレートやVMイメージがあるストレージの名称を入れる。

WebUIでは以下と対応している。


CTテンプレートがない場合は以下のようにダウンロードをする

※ ここでは nas にダウンロードしているが、適宜ダウンロード先は変える

terraform planをする

$ terraform plan

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_lxc.basic will be created
  + resource "proxmox_lxc" "basic" {
      + arch         = "amd64"
      + cmode        = "tty"
      + console      = true
      + cores        = 1
      + cpulimit     = 0
      + cpuunits     = 1024
      + hostname     = "lxc-basic"
      + id           = (known after apply)
      + memory       = 512
      + onboot       = false
      + ostemplate   = "nas:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
      + ostype       = (known after apply)
      + password     = (sensitive value)
      + protection   = false
      + start        = false
      + swap         = 0
      + target_node  = "pve5amd"
      + tty          = 2
      + unprivileged = true
      + unused       = (known after apply)
      + vmid         = (known after apply)

      + network {
          + bridge = "vmbr0"
          + hwaddr = (known after apply)
          + ip     = "dhcp"
          + name   = "eth0"
          + tag    = (known after apply)
          + trunks = (known after apply)
          + type   = (known after apply)
        }

      + rootfs {
          + size    = "8G"
          + storage = "local-lvm"
          + volume  = (known after apply)
        }
    }

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

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if
you run "terraform apply" now.

この内容でLXCを作成し、問題なければ terraform apply を実行する

terraform apply

$ terraform apply

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_lxc.basic will be created
  + resource "proxmox_lxc" "basic" {
      + arch         = "amd64"
      + cmode        = "tty"
      + console      = true
      + cores        = 1
      + cpulimit     = 0
      + cpuunits     = 1024
      + hostname     = "lxc-basic"
      + id           = (known after apply)
      + memory       = 512
      + onboot       = false
      + ostemplate   = "nas:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
      + ostype       = (known after apply)
      + password     = (sensitive value)
      + protection   = false
      + start        = false
      + swap         = 0
      + target_node  = "pve5amd"
      + tty          = 2
      + unprivileged = true
      + unused       = (known after apply)
      + vmid         = (known after apply)

      + network {
          + bridge = "vmbr0"
          + hwaddr = (known after apply)
          + ip     = "dhcp"
          + name   = "eth0"
          + tag    = (known after apply)
          + trunks = (known after apply)
          + type   = (known after apply)
        }

      + rootfs {
          + size    = "8G"
          + storage = "local-lvm"
          + volume  = (known after apply)
        }
    }

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_lxc.basic: Creating...
proxmox_lxc.basic: Still creating... [10s elapsed]
proxmox_lxc.basic: Creation complete after 10s [id=pve5amd/lxc/114]

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

おわりに

以上で、Terraformを用いてProxmox上のLXCをTerraformで管理する準備ができた。

Terraformで環境を管理できるため、都度WebUIでいじる必要がなく、手軽に環境を作ったり壊したりが可能になった。

Discussion