OpenTofuでProxmox VEのCT(Container)を起動する



# 0. はじめに

Proxmoxでコンテナとか気軽に立てられたらいいんじゃないかと思い立って、Proxmoxをインストールし、時代は豆腐だと思ったので、OpenTofuを使ったらハマったので、ムシャクシャしてQiita記事を書きます。

# 1. Proxmoxは普通に？インストールします。

バージョンは以下の通りです。

Manager Version pve-manager/8.2.7/3e0176e6bb2ade3b
Linux 6.8.4-2-pve (2024-04-10T17:36Z)

`ubuntu-22.04-standard_22.04-1_amd64.tar.zst` を後ほど使うので、
CT Templateでダウンロードしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/0138a425-a6fb-86c8-11ea-bd06a9b0e46f.png)


# 2. OpenTofuの注意点

以下の方法でインストールすればOK
何の問題もありません。

Installing OpenTofu on \.deb\-based Linux \(Debian, Ubuntu, etc\.\) \| OpenTofu 
https://opentofu.org/docs/intro/install/deb/

OpenTofuのバージョンは以下の通りです。

```
OpenTofu v1.8.3
on linux_amd64
+ provider registry.opentofu.org/telmate/proxmox v2.9.11
```

# 3. tfファイル

```tf
terraform {
  required_providers {
    proxmox = {
      source = "telmate/proxmox"
      version = "2.9.11"
    }
  }
}

provider "proxmox" {
  pm_api_url = "https://proxmox.hogehoge.dev:8006/api2/json"
  pm_log_enable = true
  pm_log_file   = "terraform-plugin-proxmox.log"
  pm_debug      = true
  pm_log_levels = {
    _default    = "debug"
    _capturelog = ""
  }
}

resource "proxmox_lxc" "ubuntu_container" {
  target_node  = "proxmox"
  hostname     = "ubuntu-22-04-lxc"
  ostemplate   = "local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
  password     = "your-root-password"
  unprivileged = true

  // 基本設定
  cores  = 2
  memory = 2048
  swap   = 512
  onboot = true

  // ストレージ
  rootfs {
    storage = "local-lvm"
    size    = "8G"
  }
}
```

超適当ですが、動かせることを確認するだけなのでこれで十分です。

気になる方は、こちらを参照してください。

lxc \- telmate/proxmox \- OpenTofu Registry 
https://search.opentofu.org/provider/telmate/proxmox/latest/docs/resources/lxc

https://github.com/hnrazevedo/terraform-provider-proxmox/blob/aca3fdd0f75d127cec5db2690b3f64ecbecab7ff/examples/lxc_example.tf

# 3. tofu用の認証アカウントを作成

以下のコマンドでTofu用の専用アカウントを作製しましょう。
API Tokenでもいいはずですが、うまくいきませんでした。

```
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 {Password}
pveum aclmod / -user terraform-prov@pve -role TerraformProv
```

上記でアカウントはできるのですが、`Priviledge Separation`を外す必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/e88646ad-38c1-a9ec-59a5-291eb2b83859.png)

今回のはまりポイントはここ

# 4. Tofuオペレーションを実行

ユーザーを環境変数で宣言
```
export PM_USER='terraform-prov@pve'
export PM_PASS="{Password}"
```

Providerをインストール
```
tofu init
```

Planを実行
```
tofu plan
```

Applyを実行
```
tofu apply
```

実行結果
```
$ tofu apply

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

OpenTofu will perform the following actions:

  # proxmox_lxc.ubuntu_container will be created
  + resource "proxmox_lxc" "ubuntu_container" {
      + arch         = "amd64"
      + cmode        = "tty"
      + console      = true
      + cores        = 2
      + cpulimit     = 0
      + cpuunits     = 1024
      + hostname     = "ubuntu-22-04-lxc"
      + id           = (known after apply)
      + memory       = 2048
      + onboot       = true
      + ostemplate   = "local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
      + ostype       = (known after apply)
      + password     = (sensitive value)
      + protection   = false
      + start        = false
      + swap         = 512
      + target_node  = "proxmox"
      + tty          = 2
      + unprivileged = true
      + unused       = (known after apply)
      + vmid         = (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?
  OpenTofu will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

proxmox_lxc.ubuntu_container: Creating...
proxmox_lxc.ubuntu_container: Still creating... [10s elapsed]
proxmox_lxc.ubuntu_container: Creation complete after 10s [id=proxmmox/lxc/101]
```

# 4. まとめ

次は、Startスクリプトにも挑戦してみます。

# 5. 参考


https://qiita.com/ymbk990/items/bd3973d2b858eb86e334

https://github.com/Telmate/terraform-provider-proxmox/issues/252

Proxmox with OpenTofu Kubespray and Kubernetes \| From 0\.985mhz\.\.\. to several Ghz 
https://blog.andreasm.io/2024/01/15/proxmox-with-opentofu-kubespray-and-kubernetes/